如何找出图像的遮罩区域的平均颜色(rgb)

时间:2017-10-24 10:08:41

标签: imagemagick

我想获得png图像的遮罩区域的rgb中的平均颜色。

以下只输出整个图像的平均颜色

convert demo.png -mask demo_mask.png -resize 1x1 txt:-

3 个答案:

答案 0 :(得分:2)

你应该能够通过这样的命令得到你想要的东西......

convert image.png mask.png -compose copyopacity -composite -resize 1x1! txt:-

要仅输出颜色信息,您可以尝试这样的...

convert image.png mask.png \
    -compose copyopacity -composite -resize 1x1! -format "%[pixel:p]" info:

我还没有尝试过,但你可能不得不" -negate"您的掩码图像取决于您使用的IM版本,因为Alpha通道的处理方式发生了变化。

如果你" -trim"你会得到一个非常不同的结果。在" -resize"之前。

如果您不想输出Alpha通道信息,可以添加" -alpha off"在" -resize"。

之后

答案 1 :(得分:2)

在ImageMagick中,-scale 1x1!将忽略透明像素并为您提供不透明像素的平均值。因此,如果您想要遮罩区域的平均值,可以将遮罩放入Alpha通道,然后使用-scale 1x1!将其平均降低到一个像素。掩码应该是白色的,你想要获得平均值,黑色应该是透明的,并忽略平均值中的那些像素。所以这应该做到。

convert image.png mask.png -alpha off -compose copy_opacity -composite -scale 1x1! -alpha off -format "%[pixel:u.p{0,0}]" info:


例如,如果我制作徽标:图像透明,它是白色的,然后得到平均值,我得到

convert logo: -transparent white -scale 1x1! -alpha off -format "%[pixel:u.p{0,0}]" info:
srgb(100,81,99)


你可以通过漫长的方式证明这是有效的。将掩码乘以图像,然后得到产品每个通道的平均值。然后得到面具的平均值。然后计算缩放到0到25​​5范围的比率。

convert logo: -transparent white logot.png
convert logot.png -alpha extract mask.png

declare `convert \( logot.png -alpha off \) mask.png -compose multiply -composite -format "IR=%[fx:mean.r]\nIG=%[fx:mean.g]\nIB=%[fx:mean.b]\n" info:`
echo "IR=$IR; IG=$IG; IB=$IB"
IR=0.0651798; IG=0.0529989; IB=0.0641607

MM=`convert mask.png -format "%[fx:mean]\n" info:`
echo "MM=$MM"
MM=0.165872

convert xc: -format "srgb(%[fx:round(255*$IR/$MM)],%[fx:round(255*$IG/$MM)],%[fx:round(255*$IB/$MM)])\n" info:
srgb(100,81,99)


结果与上述相同。

ASIDE:注意

convert \( logot.png -alpha off \) mask.png -compose multiply -composite ...
在这种情况下,

相同
convert logot.png -alpha remove ...

但是如果用户有一个单独的面具和没有透明度的图像,我会向它展示很长的路。

答案 2 :(得分:1)

也许......

convert demo.png -mask demo_mask.png -trim -fx mean -extent 1x1 txt:- |\
        tail -1 | cut -d ' ' -f 4

这可行,因为-trim会将屏蔽图像缩小到ROI的MBR。 Fx运算符-fx mean会将所有像素转换为整体平均值。最后-extent 1x1将隔离图像中的第一个像素。其余的是基本的unix实用程序。

另一种性能更佳的选择......

MEAN=$(convert demo.png -mask demo_mask.png -trim -format '%[fx:mean]' info:-)
convert null: -depth 8 -format "%[pixel:$MEAN]" info:-

或者来自Quantization documentation ...

convert demo.png -mask demo_mask.png -trim -scale 1x1\! '%[pixel:s]' info:-