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

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

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

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

424da251f81ddca07e5d03266e878806.jpg

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

Смарт-кроп на основе энтропии Общая идея — найти фрагмент картинки, несущий наибольшее количество информации и сохранить его в кропнутой версии.Как это работает Сначала картинка ресайзится.2bb2acc6e9f7422e70599eda4bcae8f3.jpgЗатем запускается фильтр для определения границ. Картинка становится черно-белой и на ней остаются только контуры обьектов.49063969e77804f593c10e03b97fa71e.jpgМаксимально снижается насыщенность и картинка несколько «замыливается».c2b9dec96c93150972dd84e1aee60a2b.jpgОпределяется фрагмент с наивысшей энтропией — то есть с наибольшим количеством контуров. Возвращаются координаты этого фрагмента, то есть той части картинки, которую обрезать нельзя ни в коем случае.6f1ede11b80ca18be86485470ea70a1f.jpgСамый сложный этап — поиск фрагмента с наивысшей энтропией. Поиск выполняется фрагментарно — картинка «разрезается» на 25 полосок, подсчитывается энтропия для каждой из них и сравнивается. Затем определяется группа с максимальной энтропией.

Применение Для применения удобно использовать вот эту библиотеку.Требования: PHP 5.3 с расширением Imagick. Применяется в три этапа.Инициализация:

$center = new CropEntropy ($imagePath); Ресайз и кроп: $croppedImage = $center→resizeAndCrop ($width, $height); Cохранение нового изображения: $croppedImage→writeimage ($newImagePath); Попробовать кроп на основе энтропии можно тут, задав требуемый размер миниатюры.Иногда алгоритм безошибочно определяет самую важную область. Но иногда и ошибается, особенно при нестандартных — неквадратных параметрах кропа (300×100). Но вот очень хороший результат с теми же параметрами, но другой фоткой. Идеального результата алгоритм не гарантирует, но тем не менее является одним из лучших способов автокропа.

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

© Habrahabr.ru