ImageMagick 使用 alpha 通道来控制计算最小、最大和平均图像值

ImageMagick using alpha channel to control calculating min, max and mean image values

ImageMagick command identify 打印图像中所有像素的最小值、最大值和平均值 - 例如对于 RGB TIF 图像,我们可以看到 mean 因此:

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 与前导 -+ 一起使用,但方法并没有像预期的那样改变。

在 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