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

Command line ImageMagick使用alpha通道控制计算最小、最大和平均图像值,command-line,imagemagick,alpha,Command Line,Imagemagick,Alpha,ImageMagickidentify打印以筛选图像中所有像素的最小值、最大值和平均值-例如,对于RGB TIF图像,我们可以看到平均值,因此: 哪些列表(对于红、绿、蓝和灰色): Q:如果我的图像有一个布尔alpha通道,我可以使用它来限制计算只包括alpha设置为1的像素吗 我尝试使用剪辑蒙版与前导-或+一起使用,但方法没有如预期的那样改变。在ImageMagick中,比例为1x1!函数可用于计算平均值,而不包括alpha,以便仅获得不透明值的平均值。因此,您可以执行以下操作: 创建测试透明

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

哪些列表(对于红、绿、蓝和灰色):

Q:如果我的图像有一个布尔alpha通道,我可以使用它来限制计算只包括alpha设置为
1
的像素吗


我尝试使用
剪辑蒙版
与前导
-
+
一起使用,但方法没有如预期的那样改变。

在ImageMagick中,比例为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

要获得最小值和最大值,请借鉴马克·塞切尔的想法:

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


在ImageMagick中,比例为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

要获得最小值和最大值,请借鉴马克·塞切尔的想法:

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


是的,但不幸的是
-刻度1x1技巧不适用于最小值。我修改了我的答案,包括使用Mark Setchell建议的修改来计算最大值和最小值。是的,但不幸的是
-scale 1x1技巧不适用于最小值。我修改了我的答案,包括使用马克·塞切尔建议的修改来计算最大值和最小值。我不在电脑前,但你知道如何计算开和关alpha像素,是吗?如果将RGB通道乘以alpha通道,所有透明像素将变为黑色,这样可以找到最大值。如果乘以(255 alpha),则可以找到最小值。好主意,Mark!也谢谢马克!我不在电脑前,但你知道如何计算开和关的alpha像素,是吗?如果将RGB通道乘以alpha通道,所有透明像素将变为黑色,这样可以找到最大值。如果乘以(255 alpha),则可以找到最小值。好主意,Mark!也谢谢马克!