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

Posted

技术标签:

【中文标题】在多个图像上查找未更改的区域【英文标题】:Find unchanged areas on multiple images 【发布时间】:2021-10-09 19:33:59 【问题描述】:

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

Image 1 Image 2 Image 3

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

我已尝试使用 ImageMagick 的 compare:

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

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

遍历所有图像并加入掩码被丢弃,因为它会生成大量不需要的文件(并且可能很慢)

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

有什么简单的方法吗? 谢谢。

【问题讨论】:

【参考方案1】:

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

图片:

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

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

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

【讨论】:

【参考方案2】:

如果您使用 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 的答案非常相似,因为如果最大值和最小值相同,则方差将为零是合理的 - 尽管统计数据不是我的强项......所以如果有人知道得更好,请ping我!

【讨论】:

以上是关于在多个图像上查找未更改的区域的主要内容,如果未能解决你的问题,请参考以下文章

从二进制图像中查找坐标并将它们投影到原始图像[关闭]

用于查找从点到多边形的最小距离的 Javascript 代码(由 html 区域定义)

在给定图像边界的情况下查找填充区域

查找图中的内部区域

如果分辨率更改,则查找相似图像[重复]

在矩阵中查找较大数字的区域