如何仅使用ImageMagick命令行保留红色

问题描述

我有以下图片

enter image description here

我想要的是仅保留红色并降低饱和度 其他所有颜色变成灰度。结果:

enter image description here

如何使用Imagemagick命令行来做到这一点?

我尝试了这个但失败了:

convert original.png \( -clone 0  -transparent red -alpha extract -transparent black \) redonly.png

解决方法

这是使用ImageMagick的一种方法,尽管并不完美。我为红色指定色相= 0度,公差为25度,都在0到360之间。

输入:

enter image description here

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

enter image description here

,

也不是完美的,但相当容易理解。基本上,您可以使用fx operator检查每个像素的色相,并根据其色相/颜色,返回原始像素或等效的灰度。

因此,作为第一个步骤,您可以执行以下操作,将所有具有高Hue值的像素替换为其等效的灰度(亮度):

magick ripe.jpg -fx "(u.hue<0.1)? u : u.lightness" result.jpg

enter image description here

那么您可能会意识到红色的色相在色相圈上以0/360度环绕,所以您可以这样做:

magick ripe.jpg -fx "(u.hue<0.1)||(u.hue>0.9)? u : u.lightness" result.jpg

enter image description here

说明

这里发生了几件事。首先,-fx运算符是一种非常低级的功能,非常强大(并且令人遗憾的是,由于它被解释,所以很慢),它在图像的每个像素上运行一段“ code” 。其次,我正在运行以下格式的三元运算符:

condition? valueA : valueB

所以我正在测试每个像素的条件,如果为true,则返回valueA,如果为false,则返回valueB。当我引用uu.hueu.lightness时,u表示命令中的 first 图像-我可以加载两个图像并使用首先选择第二个功能,然后使用uv进行区分。最后,这些值将在[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运算符,三元,逐像素,求值,表达式。