ImageMagick使用Alpha通道控制计算最小,最大和平均图像值

时间:2018-11-19 19:31:00

标签: command-line imagemagick alpha

ImageMagick command identify进行打印以屏蔽图像中所有像素的最小值,最大值和平均值-例如对于RGB TIF图像,我们可以看到平均值

identify -verbose -quiet image.tif | grep mean

其中列出了(红色,绿色,蓝色和灰色):

mean: 122.974 (0.48225)
mean: 107.722 (0.422438)
mean: 84.1278 (0.329913)
mean: 104.941 (0.411534)

问:,如果我的图像具有布尔Alpha通道,我可以使用它来限制计算以仅包括alpha设置为1的那些像素吗?

我尝试使用clip-mask-开头的+ option,但是方法没有像预期的那样改变。

1 个答案:

答案 0 :(得分:2)

在ImageMagick中,-scale为1x1!函数可用于计算均值,而无需包含alpha,因此您只能获得不透明值的均值。因此,您可以执行以下操作:

创建测试透明图像:

convert logo: -transparent white logot.png


计算平均值:

convert logot.png -scale 1x1! -alpha off -format "%[fx:255*u.r], %[fx:255*u.g], %[fx:255*u.b]" info:

100.202, 81.4747, 98.6342


或者,您可以使用Alpha通道作为蒙版来获取均值。您可以计算没有Alpha通道的每个通道的平均值,并将Alpha下的背景设置为黑色。然后计算Alpha通道的平均值。然后将每个通道的平均值除以alpha通道的平均值。

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

means_rgb=$(convert logot.png -background black -alpha background -alpha off -format "%[fx:mean.r],%[fx:mean.g],%[fx:mean.b]" info:)
mean_r=$(echo $means_rgb | cut -d, -f1)
mean_g=$(echo $means_rgb | cut -d, -f2)
mean_b=$(echo $means_rgb | cut -d, -f3)

mean_alpha=$(convert alpha.png -format "%[fx:mean]" info:)

mean_r=$(convert xc: -format "%[fx:255*$mean_r/$mean_alpha]" info:)
mean_g=$(convert xc: -format "%[fx:255*$mean_g/$mean_alpha]" info:)
mean_b=$(convert xc: -format "%[fx:255*$mean_b/$mean_alpha]" info:)

echo "$mean_r, $mean_g, $mean_b"

100.203, 81.4768, 98.6362


要获取最小值和最大值,请参考马克·谢彻尔(Mark Setchell)的想法:

convert logot.png -background black -alpha background -alpha off -format "%[fx:255*maxima.r], %[fx:255*maxima.g], %[fx:255*maxima.b]\n" info:

255, 250, 244


convert logot.png -background white -alpha background -alpha off -format "%[fx:255*minima.r], %[fx:255*minima.g], %[fx:255*minima.b]\n" info:

4, 0, 0