不包括 Imagemagick 透明度的平均图像颜色

Average image color excluding transparency with Imagemagick

使用 IM 的 CLI,我试图获取图像的平均图像颜色,不包括任何透明像素。通常使用的 -resize 1x1 info:- 在这种情况下没有用,因为显然透明像素会影响结果(在某些情况下你最终会得到一个完全透明的像素)

我现在的后备方案是使用 -define histogram:unique-colors=true -format %c histogram:info:- 提取它们并手动排除透明的,但这对于 IM 可能已经提供的东西来说感觉很复杂。

在 ImageMagick 中,您可以通过

获得不包括透明度的平均(均值)颜色
convert image -scale 1x1! -alpha off -format "%[pixel:u.p]" info:

示例:

convert logo: -transparent white -scale 1x1! -alpha off -format "%[pixel:u.p]\n" info:

srgb(100,81,99)


如果使用 ImageMagick 7,则将 convert 替换为 magick。

补充:还有很长的路要走。计算图像每个通道的平均值。计算 alpha 通道的平均值。然后分。

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

declare `convert logot.png -alpha remove -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)