У меня есть целый набор изображений иллюстраций, которые я хотел бы обрезать к меньшему размеру предварительного просмотра.
Проблема состоит в том, что я хочу обрезать их, чтобы показать "интересную" часть иллюстрации (т.е. избежать областей пробела).
Изображения обычно имеют чистый цвет или тонкий градиент для фона. Они - главным образом векторные иллюстрации стиля с довольно отличными формами.
Вот некоторые примеры: ссылка ;-)
Я думал об использовании своего рода алгоритма выявления признаков изображения с раздвижным окном находить область с самым большим количеством функций.
Я реализую это в PHP, но я не возражаю реализовывать его сам, если нет библиотеки или доступного расширения.
Идеи?
ImageMagick для PHP имеет автоматическое создание эскизов . В этом SO-вопросе есть ссылка на оператор автообрезки ImageMagick, и я не уверен, но я думаю, что это является интерфейсом PHP к нему.
Из ссылка :
bool Imagick :: trimImage (float $ fuzz)
Удалить края, которые являются фоном. цвет из изображения.
Для более общего «интереса», возможно, попробуйте сделать обратную резьбу по шву (чтобы найти области с наибольшей энергией, а не с областями с наименьшей энергией).
Что ж, вы можете подумать об использовании алгоритма обнаружения краев. Выберите область с наибольшим количеством краев. Придавайте больший вес краям, которые не размыты (так как они могут быть от фона).
ImageMagick имеет операцию обрезки . Он доступен в виде библиотеки, но я не знаю, насколько сложно использовать PHP. Есть несколько интерфейсов PHP .
Хорошо, вот что я сделал бы, посмотрев на примеры :
Суммировать все строки и все столбцы каждого изображения. Вы получите два массива, оба выглядящие следующим образом:
/-----\ /--\
_/ -- |
___- \_________
Посмотрев на эти массивы для нескольких изображений, найдите подходящий порог (возможно, что-то чуть выше нуля). Тогда крайнее левое и крайнее правое пересечение этого порога - это место, где вы должны обрезать. Надеюсь, мне удалось это прояснить, если нет - спрашивайте!
Программа 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]);
?>
Он должен работать достаточно хорошо, пока изображение не имеет рамки вокруг его границы.
Вот довольно простой подход с использованием фильтра обнаружения краев и последующей обрезки по центру края изображения для создания миниатюры. Это хорошо работает с большинством изображений, но не с более чем одним предметом. Я открыт для предложений о других способах выявления "интересных" точек в исходном изображении.