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

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

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

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

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

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

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

Идеи?

5
задан user139107 1 March 2010 в 01:30
поделиться

6 ответов

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

Из ссылка :

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

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

1
ответ дан 14 December 2019 в 04:36
поделиться

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

1
ответ дан 14 December 2019 в 04:36
поделиться

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

2
ответ дан 14 December 2019 в 04:36
поделиться

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

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

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

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

1
ответ дан 14 December 2019 в 04:36
поделиться

Программа 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
ответ дан 14 December 2019 в 04:36
поделиться

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

1
ответ дан 14 December 2019 в 04:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: