ImageMagick:将 AE 失真除以 fx 输出信息格式的总像素
ImageMagick: Divide AE distortion by total pixels in fx output info format
我正在尝试使用 ImageMagick 7 来检测图像中的特定通道是否主要是纯黑色和纯白色(加上一点抗锯齿,图像有可能是纯黑色)。这是为了区别于另一种共享命名约定但在 r/g/b 通道中具有类似照片的图像数据的图像。
(基本上这两种图像类型都是来自不同引擎的高光贴图。我在这里要区分的一种更现代,在蓝色通道中有金属贴图;另一种更古老,只有 RGB 通道中的镜面反射颜色和 alpha 中的光泽贴图。)
目前我正在将通道与应用了 50% 阈值的自身克隆进行比较,使用 AE 指标来查看除了少量的抗锯齿和 1 的模糊度之外它是否基本相同% 以说明与纯 black/white 的偶然偏差。此命令有效,但当然目前它只有 returns 失真像素数:
magick ( "file.png" -channel b -separate ) ^
( +clone -channel b -separate -threshold 50% ) ^
-fuzz 1% -metric AE -compare ^
-format "%[distortion]" info:
因为输入图像的大小会有所不同,所以我想将失真除以图像中的像素总数以获得不纯图像的相对数量black/white - 到目前为止,在我的手动测试中,低于 10% 似乎不错 - 但我无法正确使用格式语法。我尝试过的一切——例如 "%[fx:%[distortion]/w*h]"
——都出现了 magick: undefined variable `[distortion]' @ error/fx.c/FxGetSymbol/1169
错误。
我应该使用什么语法? (如果有更好的方法来做我正在做的事情,我总是很感激!)
我相信以下是您在 Imagemagick 中想要的。基本上,您将失真保存在 -set option:
参数中,然后稍后在 -fx
中使用它。
然而,+clone
只给你 b 频道,所以你的第二行应该不需要 -channel b -separate
。
magick ( "file.png" -channel b -separate ) ^
( +clone -threshold 50% ) ^
-fuzz 1% -metric AE -compare ^
-set option:distort "%[distortion]" ^
-format "%[fx:distort/(w*h)]" info:
Fred (@fmw42) 已经提供了一个很好的方法。还有另一种方法可以将纯黑白图像与具有更完整色调的灰度图像区分开来,您可能会感兴趣。感谢 Anthony Thyssen 所描述的技术 here。
如果你在 ImageMagick 中使用 -solarize 50%
它会反转所有高光,所以它有效地将你的直方图对折并且所有的白色都变成纯黑色并且所有 near-whites变得接近黑人。命令如下所示:
magick INPUT -solarize 50% OUTPUT
因此,如果我将其应用于几个输入图像 - 第一个是纯黑色和近白色,第二个是灰度 - 并在右侧显示相应的输出图像,您将看到效果:
如果您现在检查两个曝光图像的均值和标准差:
magick {a,b}-sol.jpg -format "%f, mean: %[mean], stdev: %[standard-deviation]\n" info:
a-sol.jpg, mean: 2328.91, stdev: 3175.67
b-sol.jpg, mean: 16319.5, stdev: 9496.04
你可以看到第一张(纯黑白)图像的均值和标准差较低,因为所有明亮的白色都折叠成接近黑色,而灰度图像的均值和标准差都较高因为色调更分散。
我正在尝试使用 ImageMagick 7 来检测图像中的特定通道是否主要是纯黑色和纯白色(加上一点抗锯齿,图像有可能是纯黑色)。这是为了区别于另一种共享命名约定但在 r/g/b 通道中具有类似照片的图像数据的图像。
(基本上这两种图像类型都是来自不同引擎的高光贴图。我在这里要区分的一种更现代,在蓝色通道中有金属贴图;另一种更古老,只有 RGB 通道中的镜面反射颜色和 alpha 中的光泽贴图。)
目前我正在将通道与应用了 50% 阈值的自身克隆进行比较,使用 AE 指标来查看除了少量的抗锯齿和 1 的模糊度之外它是否基本相同% 以说明与纯 black/white 的偶然偏差。此命令有效,但当然目前它只有 returns 失真像素数:
magick ( "file.png" -channel b -separate ) ^
( +clone -channel b -separate -threshold 50% ) ^
-fuzz 1% -metric AE -compare ^
-format "%[distortion]" info:
因为输入图像的大小会有所不同,所以我想将失真除以图像中的像素总数以获得不纯图像的相对数量black/white - 到目前为止,在我的手动测试中,低于 10% 似乎不错 - 但我无法正确使用格式语法。我尝试过的一切——例如 "%[fx:%[distortion]/w*h]"
——都出现了 magick: undefined variable `[distortion]' @ error/fx.c/FxGetSymbol/1169
错误。
我应该使用什么语法? (如果有更好的方法来做我正在做的事情,我总是很感激!)
我相信以下是您在 Imagemagick 中想要的。基本上,您将失真保存在 -set option:
参数中,然后稍后在 -fx
中使用它。
然而,+clone
只给你 b 频道,所以你的第二行应该不需要 -channel b -separate
。
magick ( "file.png" -channel b -separate ) ^
( +clone -threshold 50% ) ^
-fuzz 1% -metric AE -compare ^
-set option:distort "%[distortion]" ^
-format "%[fx:distort/(w*h)]" info:
Fred (@fmw42) 已经提供了一个很好的方法。还有另一种方法可以将纯黑白图像与具有更完整色调的灰度图像区分开来,您可能会感兴趣。感谢 Anthony Thyssen 所描述的技术 here。
如果你在 ImageMagick 中使用 -solarize 50%
它会反转所有高光,所以它有效地将你的直方图对折并且所有的白色都变成纯黑色并且所有 near-whites变得接近黑人。命令如下所示:
magick INPUT -solarize 50% OUTPUT
因此,如果我将其应用于几个输入图像 - 第一个是纯黑色和近白色,第二个是灰度 - 并在右侧显示相应的输出图像,您将看到效果:
如果您现在检查两个曝光图像的均值和标准差:
magick {a,b}-sol.jpg -format "%f, mean: %[mean], stdev: %[standard-deviation]\n" info:
a-sol.jpg, mean: 2328.91, stdev: 3175.67
b-sol.jpg, mean: 16319.5, stdev: 9496.04
你可以看到第一张(纯黑白)图像的均值和标准差较低,因为所有明亮的白色都折叠成接近黑色,而灰度图像的均值和标准差都较高因为色调更分散。