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

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

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

Изображения обычно имеют плоский цвет или тонкий градиент фона. В основном это векторные рисунки с довольно четкими формами.

Вот несколько примеров: ссылка ; -)

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

Я реализую это в PHP, но я не против реализовать это сам, если нет доступной библиотеки или расширения.

Идеи

Ответы [ 7 ]

2 голосов
/ 01 марта 2010

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

1 голос
/ 04 февраля 2011

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

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

1 голос
/ 22 июня 2010

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

1 голос
/ 01 марта 2010

Программа 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]);
?>

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

1 голос
/ 01 марта 2010

ОК, вот что я бы сделал, посмотрев на примеры:

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

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

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

1 голос
/ 01 марта 2010

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

С ссылка :

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

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

1 голос
/ 01 марта 2010

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

...