imagmagick: выборочно заполнять пиксели в зависимости от состояния r / g / b? - PullRequest
0 голосов
/ 30 августа 2018

Есть ли способ выборочной замены цветов на основе арифметического выражения с использованием значения R или G или B пикселя?

Пример: скажем, у меня есть изображение RGB "foobar.png", и я хочу изменить все пиксели, чей красный канал <100, на белый. </p>

В псевдокоде:

for (all pixels in image) { if (pixel.red < 100) then pixel = 0xffffff; }

Есть ли способ осуществить это с помощью ImageMagick?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Это похоже, но немного отличается от отличного решения emcconville. Это в синтаксисе Unix.

#1 compute the 100 out of 255 threshold in percent
#2 read the input
#3 clone the input and make it completely white
#4 clone the input and separate the red channel, threshold and negate so that the white part represents values less than 100 out of 255
#5 use the threshold image as a mask in a composite to select between the original and the white images
#6 write the output

thresh=`convert xc: -format "%[fx:100*100/255]" info:`
convert image.png \
\( -clone 0 -fill white -colorize 100 \) \
\( -clone 0 -channel r -separate +channel -threshold $thresh% -negate \) \
-compose over -composite \
result.png


enter image description here

0 голосов
/ 30 августа 2018

Вы можете использовать FX выражения .

Скажем, я создаю тестовое изображение ...

convert -size 400x400 gradient:red-blue input.png

input

Заменить любой пиксель красным значением <100 (при условии, что максимальное значение равно 8-битному кванту 255), может быть выражено как ... </p>

convert input.png -fx 'r < (100/255) ? #FFFFFF : u' output.png

output

Обновление

FX мощный, но медленный. Это также нарисует резкие края. Другой подход состоит в том, чтобы отделить КРАСНЫЙ канал, преобразовать его в маску и объединить по другим каналам. Это можно сделать с помощью -evaluate-sequance MAX или установить альфа-канал и создать композицию на белом фоне.

Создать пример входного изображения.

convert -size 400x400 xc:white \
    -sparse-color shepards '0 0 red 400 0 blue 400 400 green 0 400 yellow ' \
    input.png

input

convert -size 400x400 xc:white \
    \( input.png \
        \( +clone  -separate -delete 1,2 \
           -negate -level 39% -negate \
        \) \
        -compose CopyOpacity -composite \
    \) -compose Atop -composite  output.png

output

...