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

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

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

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

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

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

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

Идеи?


person user139107    schedule 01.03.2010    source источник
comment
Это профессиональные фото? Если это так, ознакомьтесь с правилом третей, оно должно, по крайней мере, уменьшить различные области, на которые нужно «смотреть».   -  person Jeffrey Aylesworth    schedule 01.03.2010
comment
Действительно ли пустое пространство представляет собой сплошной цвет или это просто менее насыщенные области изображения?   -  person Matthew    schedule 01.03.2010


Ответы (7)


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

person lhf    schedule 01.03.2010

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

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

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

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

person AVB    schedule 01.03.2010
comment
Не суммируйте строки и столбцы, суммируйте разницы между одной строкой/столбцом и следующей. - person Mark Ransom; 22.06.2010

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

person Jue    schedule 21.06.2010

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

person Brian    schedule 01.03.2010

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

Из ссылки:

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

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

person datageist    schedule 01.03.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]);
?>

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

person Matthew    schedule 01.03.2010

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

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

person berkes    schedule 04.02.2011