imagmagick:基于r / g / b条件选择性地填充像素?

时间:2018-08-30 08:50:51

标签: filter colors imagemagick rgb pixel

有没有一种方法可以基于使用像素的R或G或B值的算术表达式来选择性地替换颜色?

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

使用伪代码:

rainbow2

是否可以通过ImageMagick做到这一点?

2 个答案:

答案 0 :(得分:3)

这与emcconville的出色解决方案相似,但略有不同。这是Unix语法。

function walkRec(input, accumulator, state = []) {
  if (!(input instanceof Array)) input = [input];
  for (const item of input) {
    state = accumulator(item, state);
    const isObject = item !== null && typeof item == 'object';
    if (isObject && 'array' in item)
      state = walk(item.array, accumulator, state);
  }
  return state;
}


enter image description here

答案 1 :(得分:2)

您可以使用FX expressions

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

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

input

用红色<100替换任何像素(假设max-value是255的8位量子),可以表示为。

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