代码之家  ›  专栏  ›  技术社区  ›  sami_analyst

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

  •  1
  • sami_analyst  · 技术社区  · 8 年前

    我想得到png图像遮罩区域的平均颜色(rgb)。

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

    convert demo.png -mask demo_mask.png -resize 1x1 txt:-
    
    3 回复  |  直到 8 年前
        1
  •  2
  •   fmw42    8 年前

    在ImageMagick中,-比例1x1!将忽略透明像素,并给出不透明像素的平均值。因此,如果你想要遮罩区域的平均值,你可以将遮罩放入alpha通道,然后使用-比例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到255的比率。

    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)
    


    结果同上。

    旁白:注意

    convert \( logot.png -alpha off \) mask.png -compose multiply -composite ...
    

    在这种情况下与

    convert logot.png -alpha remove ...
    

    但是,如果用户有一个单独的掩码和没有透明度的图像,我会用很长的时间来展示它。

        2
  •  2
  •   GeeMack    8 年前

    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:
    

    我没有试过,但你可能不得不根据你使用的即时通讯版本来“否定”你的掩码图像,因为alpha通道的处理方式发生了变化。

    如果不想输出alpha通道信息,可以在“-resize”之后添加“-alpha off”。

        3
  •  1
  •   emcconville    8 年前

    可能

    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:-