2010-03-01 6 views
5

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

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

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

Вот некоторые примеры: link ;-)

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

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

Идеи?

+0

Эти профессиональные фотографии? Если это так, проверьте правило третей, должно по крайней мере уменьшить различные области, чтобы «смотреть» на. –

+0

Является ли «пробел» по-настоящему сплошным цветом, или просто менее богатыми функциональными областями изображения? – Matthew

ответ

1

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

1

ImageMagick for PHP имеет автоматическую генерацию thumbnails. У этого SO question есть ссылка на автозагрузчик ImageMagick, и я не уверен, но я думаю, что this - это интерфейс PHP.

От the link:

BOOL Imagick :: trimImage (поплавок $ пуха)
Удалить края, которые цвет фона из изображения.

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

2

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

1

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

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

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

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

+1

Не суммируйте строки и столбцы, суммируйте * разницы * между одной строкой/столбцом и следующей. –

1

программа А 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

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

1

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^