代码之家  ›  专栏  ›  技术社区  ›  RocketNuts

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

  •  1
  • RocketNuts  · 技术社区  · 6 年前

    示例:假设我有一个RGB图像“foobar.png格式“我想把红色通道为<100的所有像素都变成白色。

    在伪代码中:

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

    有没有办法让ImageMagick完成这个任务?

    2 回复  |  直到 6 年前
        1
  •  2
  •   emcconville    6 年前

    你可以用 FX expressions

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

    input

    用红色值替换任何像素<100(假设最大值是255的8位量子),可以用。。

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

    output

    外汇是强大的,但缓慢。它也会画出粗糙的边缘。另一种方法是分离红色通道,将其转换为掩模,然后在其他通道上合成。这可以通过 -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

        2
  •  3
  •   fmw42    6 年前

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