如何解决如何仅使用ImageMagick命令行保留红色
我想要的是仅保留红色并降低饱和度 其他所有颜色变成灰度。结果:
如何使用Imagemagick命令行来做到这一点?
我尝试了这个但失败了:
convert original.png \( -clone 0 -transparent red -alpha extract -transparent black \) redonly.png
解决方法
这是使用ImageMagick的一种方法,尽管并不完美。我为红色指定色相= 0度,公差为25度,都在0到360之间。
输入:
hue=0
tolerance=25
toler=`convert xc: -format "%[fx:(100*$tolerance/360)]" info:`
hueval=`convert xc: -format "%[fx:50-$hue]" info:`
thresh=`convert xc: -format "%[fx:100-$tolerance]" info:`
convert tomato.jpg \
\( -clone 0 -colorspace gray -colorspace sRGB \) \
\( -clone 0 -colorspace HSL -channel 0 -separate +channel \
-evaluate AddModulus ${hueval}% \
-solarize 50% -level 0x50% \
-threshold $thresh% \) \
-swap 0,1 -alpha off -compose over -composite \
result.jpg
,
也不是完美的,但相当容易理解。基本上,您可以使用fx operator检查每个像素的色相,并根据其色相/颜色,返回原始像素或等效的灰度。
因此,作为第一个步骤,您可以执行以下操作,将所有具有高Hue值的像素替换为其等效的灰度(亮度):
magick ripe.jpg -fx "(u.hue<0.1)? u : u.lightness" result.jpg
那么您可能会意识到红色的色相在色相圈上以0/360度环绕,所以您可以这样做:
magick ripe.jpg -fx "(u.hue<0.1)||(u.hue>0.9)? u : u.lightness" result.jpg
说明
这里发生了几件事。首先,-fx
运算符是一种非常低级的功能,非常强大(并且令人遗憾的是,由于它被解释,所以很慢),它在图像的每个像素上运行一段“ code” 。其次,我正在运行以下格式的三元运算符:
condition? valueA : valueB
所以我正在测试每个像素的条件,如果为true,则返回valueA
,如果为false,则返回valueB
。当我引用u
和u.hue
和u.lightness
时,u
表示命令中的 first 图像-我可以加载两个图像并使用首先选择第二个功能,然后使用u
和v
进行区分。最后,这些值将在[0,1]范围内缩放,因此我不会在[0,360]“ 范围内测试” Hue> 350“,而是将Hue>0.9
测试为一个草率的等效项-我猜我本可以使用Hue>(350/360)
。请注意,您可以使表达式任意复杂,也可以将其放在一个单独的文件中以重新使用,如下所示:
magick ripe.jpg -fx @DeSatNonRed.fx result.jpg
DeSatNonRed.fx
可能看起来像这样:
hueMin=350/360;
hueMax=20/360;
(hue>hueMin) || (hue<hueMax) ? u : u.lightness
请注意,在一般情况下,您在查看色相时也应该真正考虑饱和度,您可以在上面添加色相,但是为了清楚起见我将其省略,因为无论如何您的图像几乎都是饱和的。
关键字:图像处理,ImageMagick,低级fx运算符,三元,逐像素,求值,表达式。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。