在多个图像上查找未更改的区域
Find unchanged areas on multiple images
我正在尝试检测在 40-50 张图像之间没有变化的区域(基本上是未变化的像素)。为简单起见,我将提供一个只有 3 张图片的示例:
- Image 1
- Image 2
- Image 3
This 可能是程序的输出,一个显示这 3 个图像中未触及的内容的掩码。
我已经尝试使用来自 ImageMagick 的 compare:
compare *.png -fuzz 20 -compose src mask.png
但似乎不支持文件数组,因为它只产生前两个图像之间的差异:mask.png
遍历所有图像并加入蒙版被丢弃,因为它会生成大量不需要的文件(并且可能很慢)
我知道这与“如何获得图像之间的差异”是同一个问题,但是当图像超过 2 张时,针对这些问题给出的所有解决方案都不适用
有什么简单的方法吗?
谢谢。
您可以通过计算所有图像的标准差然后选取最暗的区域来实现。 (低标准偏差意味着相似)。在某个级别设置阈值并取反,以便这些区域为白色。这可以使用我的 bash unix shell scripts for imagemagick 之一来完成,称为 stdimage,它对所有输入图像执行 std。然后阈值和取反。
图片:
stdimage image1.png image2.png image3.png miff:- | convert - -threshold 0 -negate result.png
没有我的脚本,可以使用 -fx 计算所有图像的标准差。
如果你有一张图片只是背景,那么你可以从每张图片和阈值中减去它。然后使用 -evaluate-sequence multiply 将所有阈值图像相乘。否定后会得到相同的结果。
如果您使用 ImageMagick -evaluate-sequence
运算符在图像中的每个点找到最大(即最亮)像素,然后再次找到最小(即最暗)像素每个点的像素...然后您可以计算两个结果之间的差异,如果没有差异,则像素很可能在整个图像集中保持不变:
magick *.png -evaluate-sequence max \
\( *.png -evaluate-sequence min \) \
-compose difference -composite -threshold 0 result.png
或者,如果您有足够的 RAM,您可以通过在 MPR 中复制您的序列来避免读取它们两次:
magick *.png -alpha off -write MPR:seq \
-evaluate-sequence max \
\( MPR:seq -evaluate-sequence min \) \
-compose difference -composite -threshold 0 result.png
仔细想想,这实际上与 Fred 的回答非常相似,因为按理说,如果最大值和最小值相同,方差将为零 - 尽管统计数据不是我的强项......所以如果有人知道得更多,请联系我!
我正在尝试检测在 40-50 张图像之间没有变化的区域(基本上是未变化的像素)。为简单起见,我将提供一个只有 3 张图片的示例:
- Image 1
- Image 2
- Image 3
This 可能是程序的输出,一个显示这 3 个图像中未触及的内容的掩码。
我已经尝试使用来自 ImageMagick 的 compare:
compare *.png -fuzz 20 -compose src mask.png
但似乎不支持文件数组,因为它只产生前两个图像之间的差异:mask.png
遍历所有图像并加入蒙版被丢弃,因为它会生成大量不需要的文件(并且可能很慢)
我知道这与“如何获得图像之间的差异”是同一个问题,但是当图像超过 2 张时,针对这些问题给出的所有解决方案都不适用
有什么简单的方法吗? 谢谢。
您可以通过计算所有图像的标准差然后选取最暗的区域来实现。 (低标准偏差意味着相似)。在某个级别设置阈值并取反,以便这些区域为白色。这可以使用我的 bash unix shell scripts for imagemagick 之一来完成,称为 stdimage,它对所有输入图像执行 std。然后阈值和取反。
图片:
stdimage image1.png image2.png image3.png miff:- | convert - -threshold 0 -negate result.png
没有我的脚本,可以使用 -fx 计算所有图像的标准差。
如果你有一张图片只是背景,那么你可以从每张图片和阈值中减去它。然后使用 -evaluate-sequence multiply 将所有阈值图像相乘。否定后会得到相同的结果。
如果您使用 ImageMagick -evaluate-sequence
运算符在图像中的每个点找到最大(即最亮)像素,然后再次找到最小(即最暗)像素每个点的像素...然后您可以计算两个结果之间的差异,如果没有差异,则像素很可能在整个图像集中保持不变:
magick *.png -evaluate-sequence max \
\( *.png -evaluate-sequence min \) \
-compose difference -composite -threshold 0 result.png
或者,如果您有足够的 RAM,您可以通过在 MPR 中复制您的序列来避免读取它们两次:
magick *.png -alpha off -write MPR:seq \
-evaluate-sequence max \
\( MPR:seq -evaluate-sequence min \) \
-compose difference -composite -threshold 0 result.png
仔细想想,这实际上与 Fred 的回答非常相似,因为按理说,如果最大值和最小值相同,方差将为零 - 尽管统计数据不是我的强项......所以如果有人知道得更多,请联系我!