有没有一种方法可以基于使用像素的R或G或B值的算术表达式来选择性地替换颜色?
例如:说我有一个RGB图像“ foobar.png”,我想将红色通道<100的所有像素都更改为白色。
使用伪代码:
rainbow2
是否可以通过ImageMagick做到这一点?
答案 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;
}
答案 1 :(得分:2)
您可以使用FX
expressions。
说我创建一个测试图像...
convert -size 400x400 gradient:red-blue input.png
用红色<100替换任何像素(假设max-value是255的8位量子),可以表示为。
convert input.png -fx 'r < (100/255) ? #FFFFFF : u' output.png
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
convert -size 400x400 xc:white \
\( input.png \
\( +clone -separate -delete 1,2 \
-negate -level 39% -negate \
\) \
-compose CopyOpacity -composite \
\) -compose Atop -composite output.png