imagemagick:根据r / g / b条件有选择地填充像素?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了imagemagick:根据r / g / b条件有选择地填充像素?相关的知识,希望对你有一定的参考价值。

有没有办法根据使用像素的R或G或B值的算术表达式有选择地替换颜色?

示例:假设我有一个RGB图像“foobar.png”,我想将红色通道<100的所有像素更改为白色。

在伪代码中:

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

有没有办法用ImageMagick解决这个问题?

答案

你可以使用FX expressions

说我创建一个测试图像......

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

input

用红色值<100替换任何像素(假设最大值是8位量子点255),可以表示为..

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

output

更新

FX很强大,但很慢。它也会画出粗糙的边缘。另一种方法是分离RED通道,将其转换为掩码,并在其他通道上进行复合。这可以使用-evaluate-sequance MAX完成,或者设置alpha通道并在白色背景上进行构图。

创建示例输入图像。

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

另一答案

这与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

以上是关于imagemagick:根据r / g / b条件有选择地填充像素?的主要内容,如果未能解决你的问题,请参考以下文章

Rails Carrierwave和Imagemagick,使用条件调整图像大小

如何根据R中的条件创建新变量

根据 R 中的条件创建重复行

根据条件展平 R 中的列表

r - 使用 group_by 和 mutate 根据多个条件添加新列时出现意外的“=”

r中最早的日期和ID的条件