Умный кроп на основе энтропии

от автора

Во многих веб-приложениях существует необходимость автоматического кропа — будь то вырезание аватарки из загруженного фото, превью больших изображений или создание миниатюр в больших галереях.

Но машины все еще не люди, и далеко не всегда будет вырезана нужная область. Старые способы типа вырезать миниатюру 100х100 из левого верхнего угла или из центра отходят на второй план, и на арену выходит смарт-кроп.

Традиционный смарт-кроп

Большинство библиотек для избежания искажения и растягивания фоток используют смарт-кроп. Суть в том, что сначала код ресайзит картинку так, чтобы один из параметров — длина или ширина — соответствовали заданному. Затем проверяет, соответствует ли второй параметр заданному. Если нет, выполняется кроп лишних областей начиная от центра.
Создание миниатюры, допустим, 400х400 будет происходить так:

Загвоздка в том, что далеко не всегда (а точнее почти никогда) самое главное оказывается в самом центре. Чаще всего — какая-то часть главного, но объекты чаще всего так или иначе смещены.

Смарт-кроп на основе энтропии

Общая идея — найти фрагмент картинки, несущий наибольшее количество информации и сохранить его в кропнутой версии.

Как это работает

Сначала картинка ресайзится.

Затем запускается фильтр для определения границ. Картинка становится черно-белой и на ней остаются только контуры обьектов.

Максимально снижается насыщенность и картинка несколько “замыливается”.

Определяется фрагмент с наивысшей энтропией — то есть с наибольшим количеством контуров.
Возвращаются координаты этого фрагмента, то есть той части картинки, которую обрезать нельзя ни в коем случае.

Самый сложный этап — поиск фрагмента с наивысшей энтропией. Поиск выполняется фрагментарно — картинка “разрезается” на 25 полосок, подсчитывается энтропия для каждой из них и сравнивается. Затем определяется группа с максимальной энтропией.

Применение

Требования: PHP 5.3 с расширением Imagick. Применяется в три этапа.

Инициализация:

$center = new CropEntropy($imagePath); 

Ресайз и кроп:

$croppedImage = $center->resizeAndCrop($width, $height); 

Cохранение нового изображения:

$croppedImage->writeimage($newImagePath); 

Попробовать кроп на основе энтропии можно тут, задав требуемый размер миниатюры.
Иногда алгоритм безошибочно определяет самую важную область. Но иногда и ошибается, особенно при нестандартных — неквадратных параметрах кропа (300х100). Но вот очень хороший результат с теми же параметрами, но другой фоткой. Идеального результата алгоритм не гарантирует, но тем не менее является одним из лучших способов автокропа.

Конспект

  1. Один из лучших способов автоматизации кропа — кроп на основе энтропии.
  2. Алгоритм определяет фрагмент с наибольшим количеством информации и сохраняет его в кропнутой версии.
  3. Преимущества и недостатки способа можно проверить этим инструментом.

ссылка на оригинал статьи http://habrahabr.ru/post/259997/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *