Функция imagemagick trimimage также обрезает, когда цвет фона присутствует внутри изображения (а не только границы)

Поэтому я пытаюсь обрезать границы изображения с помощью функции imagemagick trimimage (PHP) на основе цвета фона. Ниже показано, что я пытаюсь сделать и в чем проблема.

Когда я загружаю это изображение (это изображение имеет толстые белые границы сверху и справа): enter image description here

И запустите следующий код:

$canvas->setBackgroundColor('#ffffff');
$quantumRange = $canvas->getQuantumRange();
$canvas->trimImage(0.3 * $quantumRange['quantumRangeLong']);
$canvas->setImagePage(0, 0, 0, 0);

Результат именно такой, как я ожидал: белые границы обрезаются. enter image description here

Однако, используя изображение ниже (без внешних границ): enter image description here

и при запуске того же кода изображение обрезается изнутри (?) с некоторыми странными эффектами: enter image description here

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

Итак, либо я неправильно понял trimimage, либо мне что-то не хватает в реализации. Кроме того, нельзя поиграть со значением fuzz. В какой-то момент он перестанет обрезать синюю границу, но на этом этапе он также НЕ будет обрезать достаточно, если есть внешние границы, поскольку мне нужно иметь достаточно высокое значение, чтобы также удалить светлые тени или артефакты сжатия.

Итак, актуальные вопросы: 1. Есть ли способ обрезать изображение только снаружи, когда цвет внешней границы совпадает с цветом фона? Может я что-то упустил. 2. Есть ли другой метод, который вы могли бы порекомендовать?

Обновлено: После того, как @ fmw42 ответил ниже, я более подробно рассмотрел, что такое обнаружение краев и как оно работает. Я предполагал, что imagemagick смотрит на границы изображения и обрезает их на основе заданного цвета фона, что неверно. Чтобы лучше понять, проверьте, как работает обнаружение краев: https://en.wikipedia.org/wiki/Edge_detection

Спасибо.

@mspir написал EDIT: After @fmw42 answered below, I took a closer look at what exactly edge detection is and how it works. My assumption was that imagemagick looks at the borders of the image and cuts them based on the given background color , which is wrong. Почему вы говорите, что это неправильно? Это правильно для обрезки. Если вам нужна автоматическая обрезка на основе обнаружения краев, см. Мои скрипты: smarttrim и smartcrop на моем веб-сайте: fmwconcepts.com/imagemagick/index.php
fmw42 14.09.2018 18:24
1
1
539
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Imagemagick -trim будет обрезать с каждой стороны, только если цвет стороны находится в пределах значения пушистости. Ваш белый фон ничего не делает. Функция -trim смотрит на цвета краев и обрезает их внутрь до тех пор, пока строки и столбцы краев не превысят значение нечеткости для цвета краев. Он смотрит на цвета углов, чтобы определить, обрезать или нет. В первом случае у вас есть 3 белых угла. Таким образом, он обрежет белый цвет сверху и справа. Во втором случае у вас теперь есть 3 синих угла. Таким образом, он будет обрезан внутрь сверху и с правой стороны, чтобы удалить часть синего.

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

Вход1:

enter image description here

convert image1.jpg -bordercolor white -border 1 -fuzz 30% -trim +repage image_trim.jpg


Обратите внимание, что 30% эквивалентно 0,3 * квантового диапазона

enter image description here

Изображение2:

enter image description here

convert image2.jpg -bordercolor white -border 1 -fuzz 30% -trim +repage image2a_trim.jpg


enter image description here

Без добавления белой рамки -trim видит синий цвет как границу из 3 углов. Так он будет обрезан синим.

convert image2.jpg -fuzz 30% -trim +repage image2b_trim.jpg


enter image description here

Если вы увеличите значение пушистости до 50%, он будет более очевидным и урезанным для пингвина.

convert image2.jpg -fuzz 30% -trim +repage image2c_trim.jpg


enter image description here

Спасибо, этот трюк работает (на самом деле должен был прийти к нему сам - да!), И, что наиболее важно, теперь я понимаю, что обнаружение границ на самом деле не означает обнаружение границ (что было моим предположением). Для кого-то еще шоу должно это понимать, вот ссылка. en.wikipedia.org/wiki/Edge_detection Это проясняет ситуацию.

mspir 14.09.2018 09:11

Другие вопросы по теме