在多张图像上查找未更改的区域

问题描述 投票:0回答:2

我正在尝试检测 40-50 个图像之间没有变化的区域(基本上是未更改的像素)。为了简单起见,我将提供一个仅包含 3 张图像的示例:

  • Image 1
  • Image 2
  • Image 3

This 可能是程序的输出,一个显示这 3 个图像中未触及的内容的掩码。

我尝试过使用 ImageMagick 的 compare

compare *.png -fuzz 20 -compose src mask.png

但似乎不支持文件数组,因为它只产生前两个图像之间的差异:mask.png

迭代所有图像并加入蒙版将被丢弃,因为它会生成大量不需要的文件(并且可能很慢)

我知道这与“如何获取图像之间的差异”是同一个问题,但是当图像数量超过 2 个时,这些问题给出的所有解决方案都不适用

有什么简单的方法吗?

image-processing imagemagick mask
2个回答
3
投票

您可以通过计算所有图像的标准差,然后获取最暗的区域来做到这一点。 (低标准差意味着相似)。在某个级别设置阈值并进行否定,使这些区域变为白色。这可以使用我的 imagemagick 的 bash unix shell scripts 之一(称为 stdimage)来完成,它对所有输入图像进行 std 处理。然后阈值并求反。

图片:

stdimage image1.png image2.png image3.png miff:- | convert - -threshold 0 -negate result.png

如果没有我的脚本,人们可以使用 -fx 计算所有图像的标准差。

如果您有一张图像只是背景,那么您可以从每个图像和阈值中减去它。然后使用 -evaluate-sequence 乘法将所有阈值图像相乘。否定后会得到相同的结果。


1
投票

如果您使用 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 的答案相当相似,因为按理说,如果最大值和最小值相同,方差将为零。

© www.soinside.com 2019 - 2024. All rights reserved.