Умный кроп на основе энтропии
Во многих веб-приложениях существует необходимость автоматического кропа — будь то вырезание аватарки из загруженного фото, превью крупных изображений или создание миниатюр в больших галереях.
Но машины все еще не люди, и далеко не всегда будет вырезана нужная область. Старые способы типа вырезать миниатюру 100×100 из левого верхнего угла или из центра отходят на второй план, и на арену выходит смарт-кроп.
Традиционный смарт-кропБольшинство библиотек для избежания искажения и растягивания фоток используют смарт-кроп. Суть в том, что сначала код ресайзит картинку так, чтобы один из параметров — длина или ширина — соответствовали заданному. Затем проверяет, соответствует ли второй параметр заданному. Если нет, выполняется кроп лишних областей начиная от центра.Создание миниатюры, допустим, 400×400 будет происходить так:
Загвоздка в том, что далеко не всегда (а точнее почти никогда) самое главное оказывается в самом центре. Чаще всего — какая-то часть главного, но объекты чаще всего так или иначе смещены.
Смарт-кроп на основе энтропии Общая идея — найти фрагмент картинки, несущий наибольшее количество информации и сохранить его в кропнутой версии.Как это работает Сначала картинка ресайзится.Затем запускается фильтр для определения границ. Картинка становится черно-белой и на ней остаются только контуры обьектов.Максимально снижается насыщенность и картинка несколько «замыливается».Определяется фрагмент с наивысшей энтропией — то есть с наибольшим количеством контуров. Возвращаются координаты этого фрагмента, то есть той части картинки, которую обрезать нельзя ни в коем случае.Самый сложный этап — поиск фрагмента с наивысшей энтропией. Поиск выполняется фрагментарно — картинка «разрезается» на 25 полосок, подсчитывается энтропия для каждой из них и сравнивается. Затем определяется группа с максимальной энтропией.
Применение Для применения удобно использовать вот эту библиотеку.Требования: PHP 5.3 с расширением Imagick. Применяется в три этапа.Инициализация:
$center = new CropEntropy ($imagePath); Ресайз и кроп: $croppedImage = $center→resizeAndCrop ($width, $height); Cохранение нового изображения: $croppedImage→writeimage ($newImagePath); Попробовать кроп на основе энтропии можно тут, задав требуемый размер миниатюры.Иногда алгоритм безошибочно определяет самую важную область. Но иногда и ошибается, особенно при нестандартных — неквадратных параметрах кропа (300×100). Но вот очень хороший результат с теми же параметрами, но другой фоткой. Идеального результата алгоритм не гарантирует, но тем не менее является одним из лучших способов автокропа.
Конспект Один из лучших способов автоматизации кропа — кроп на основе энтропии. Алгоритм определяет фрагмент с наибольшим количеством информации и сохраняет его в кропнутой версии. Преимущества и недостатки способа можно проверить этим инструментом.