Как нарисовать качественный штрих изображения (границы) с помощью Imagemagick или PIL? - PullRequest
2 голосов
/ 03 июня 2019

Я попытался нарисовать обводку (границу) для моего PNG-изображения.original ph_res
(* ожидаемый результат стиля слоя в 19px от Photoshop)

, и я нашел полезный скрипт на форуме imagemagick.( имиджевый дискурс )

convert source.png -background '#2a7940' -alpha background -channel A -blur 9x11 stroked.png

, но мое лучшее испытание далеко от результата Photoshop.im_res

Я перепробовал много комбинаций Radius * Sigma, но, похоже, лучший результат из уловки размытия .. (-blur 9x11 для этого)

Вопрос
* Могу ли я улучшить обводку изображения с помощью Imagemagick или PIL или других инструментов CLI?
* Если так, то как?
Большое спасибо за чтение этого вопроса.

Ответы [ 3 ]

3 голосов
/ 03 июня 2019

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

convert bomb-source.png -write mpr:in -resize 200% \
   -channel A -morphology dilate disk:38 +channel \
   -fill green -colorize 100 -resize 50% mpr:in -composite result.png

Эта команда начинается с чтения входного изображения и сохранения копии в регистре памяти с именем «mpr: in».

Затем он изменяет размер ввода до 200% и использует «-морфологию», чтобы расширить форму примерно на 38 пикселей. Это сработает примерно до 19 пикселей после того, как изображение уменьшится до исходного размера.

Затем он окрашивает эту новую форму в зеленый цвет и изменяет ее на 50%, что соответствует исходному размеру.

Команда завершает работу тем, что возвращает копию «mpr: in» исходного изображения и накладывает ее на измененный зеленый фрагмент.

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

Отредактировано для добавления выходного изображения ... enter image description here

2 голосов
/ 03 июня 2019

Вот еще один способ, где я использую -blur для сглаживания обводки в ImageMagick.

Введите:

enter image description here

Line1 - read input
Line2 - clone it and make it fully opaque green
Line3 - clone the input, extract the alpha channel, dilate it to 19 or 20, then blur by 0x1 to antialias and use -level to remove the inner side of the blur
Line4 - put the dilated alpha into the alpha channel of the green image
Line5 - remove the temporary clones, swap the remaining two images and overlay the original over the green
Line6 - write the output

convert bomb-source.png \
\( -clone 0 -alpha off -fill green -colorize 100 \) \
\( -clone 0 -alpha extract -morphology dilate disk:20 -blur 0x1 -level 50x100% \) \
\( -clone 1,2 -compose copy_opacity -composite \) \
-delete 1,2 +swap -compose over -composite \
result.png

enter image description here

Если вам нужно больше сглаживания, увеличьте размытие до 0x2.

Для ImageMagick 7 замените конвертацию магией.

2 голосов
/ 03 июня 2019

Это может помочь вам начать:

convert bomb-source.png \
  \( +clone -alpha extract -morphology edge-out disk:19 -fill green -opaque white \) \
  -compose lighten -composite -transparent black result.png

enter image description here

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

Если вы добавите -write stroke.png после слова disk:19, вы получите новый файл с именем stroke.png, который показывает вам, что делает морфология.

...