Что такое хороший алгоритм или библиотека для обрезки изображений, чтобы избежать пробелов или пустых областей?

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

Проблема в том, что я хочу обрезать их, чтобы показать «интересную» часть иллюстрации (т. Е. Избегать областей пробелов).

Обычно изображения имеют плоский цвет или тонкий градиент для фона. Это, в основном, векторные работы с довольно разными формами.

Вот несколько примеров: link 😉

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

Я реализую это в PHP, но я не против его реализации, если нет библиотеки или расширения.

Идеи?

ImageMagick имеет операцию обрезки . Он доступен в виде библиотеки, но я не знаю, как это трудно использовать с PHP. Есть несколько интерфейсов PHP .

Ну, вы можете рассмотреть возможность использования алгоритма обнаружения границ. Выберите область с наибольшим количеством ребер. Дайте больший вес краям, которые не размыты (поскольку они могут быть на заднем плане).

ImageMagick для PHP имеет автоматическую генерацию эскизов . Этот вопрос SO имеет ссылку на оператор автозагрузки ImageMagick, и я не уверен, но я думаю, что это интерфейс PHP для него.

Из ссылки :

bool Imagick :: trimImage (float $ fuzz)
Удалите края, которые являются цветом фона из изображения.

Для более общей «интересности», возможно, попробуйте инверсию резьбы по швам (чтобы найти наивысшую энергию, а не самую низкую энергетическую область).

Хорошо, вот что я сделал бы, посмотрев примеры:

Суммируйте все строки и все столбцы каждого изображения. Вы получите два массива, оба выглядят так:

/-----\ /--\ _/ -- | ___- \_________ 

Посмотрев на эти массивы на несколько изображений, найдите подходящий порог (возможно, что-то чуть выше нуля). Тогда крайнее левое и самое правое пересечение этого порога – это место, где вы должны обрезать. Надеюсь, мне удалось прояснить ситуацию, если нет – спросите!

Программа CLI с использованием http://pecl.php.net/package/imagick :

 <?php dl('imagick.so'); $img = new Imagick(); $img->readImage($argv[1]); # (* 0.0: exact match; * 1.0: crop entire image) $fuzz = current($img->getQuantumRange()) * 0.25; $img->trimImage($fuzz); $img->writeImage($argv[2]); ?> 

Он должен работать достаточно хорошо, пока изображение не имеет рамки вокруг своей границы.

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

У Drupal есть проект под названием smartcrop , в котором PHP-код позволяет находить самые высокие энтропии и «интересные» области в изображениях. См. Примеры вывода .

Вы должны иметь возможность использовать функции в модуле и библиотеке в проектах без Drupal.