gpt4 book ai didi

algorithm - 查找两个图像之间的不同区域

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:29:17 24 4
gpt4 key购买 nike

我的目的是比较两个图像之间的像素并找出最小(优化)包含图像之间所有不同像素的矩形区域。简单地说,我比较了两个图像的所有像素(例如1024 * 768像素)并发现了不同的部分,但由于速度原因这不是个好主意。我需要每秒至少进行十五次比较。你知道更有效的算法吗?

最佳答案

从一张图片中减去另一张图片。相同的像素将变为零,即黑色。

找到一个黑色的角并使用 trim(修剪边框/边缘)类型的命令修剪黑色边框,它会告诉您差异区域。

如果您可以使用它,只需两行 ImageMagick 就可以非常简单地完成它 - 它可以在许多平台上用于 ​​C/C++、Python、Perl...

让我们拍两张图片,a.jpgb.jpg:

enter image description here

enter image description here

你看到我在那里做了什么吗? :-)

现在我们可以使用 ImageMagick 来找出差异和不同的区域。我正在使用命令行,但正如我所说,您可以使用 C/C++、Perl、Python、.NET 或任何您喜欢的东西。

要么用这个来找出不同点:

convert a.jpg b.jpg \
-compose difference \
-composite \
-threshold 0 \
-separate \
-evaluate-sequence Add \
diff.jpg

这给出了这个:

enter image description here

或者使用这个:

composite a.jpg b.jpg  -compose difference diff.jpg

这给出了这个:

enter image description here

或者用它做一个简单的减法:

convert a.jpg b.jpg -compose minus -composite diff.jpg

enter image description here

现在您可以使用 ImageMagick 的 border-trim 函数来评估如果您修剪掉所有黑色边框会剩下什么,如下所示:

convert a.jpg b.jpg \
-compose difference \
-composite \
-threshold 0 \
-separate \
-evaluate-sequence Add \
-format "%w %h %@" \
info:

输出这个:

400 463 264x240+80+176

告诉您图像是 400x463,如果您裁剪边框,您将留下一个 264x240 的矩形,其左上角像素从图像左上角偏移 80,176。

为了好玩,我将使用以下命令将该矩形绘制到红色图像上:

convert diff.jpg \
-stroke red \
-fill transparent \
-draw "rectangle 80,176 344,416" \
rect.jpg

这给出了这个:

enter image description here

基本上,您可以在一两行 shell 或 8-10 行 C/C++ 中完成我在此处解释的所有操作。请注意,边界框略大,因为我叠加的卡通具有透明的矩形背景。如果您需要在差异中允许一定程度的“草率”,您还可以使用 -fuzz 5% 允许图像中的细微差异。

另一种检测边界框的方法是挤压差异图像直到它是一个高图像,只有一个像素宽,如下所示:

convert diff.jpg -scale 1x! -threshold 1% t.jpg

结果如下图:

enter image description here

现在,如果您将输出转换为文本格式,您可以轻松找到第一个白色像素(您不会在程序中这样做——您会编写一个循环来代替——但我在这里展示了这个概念):

convert diff.jpg -scale 1x! -threshold 1% txt: | grep -m1 white

0,176: (255,255,255) #FFFFFF white

grep -m1 white 查找其中包含 white 的第一行,然后停止查找(匹配限制为 1)。这表明第一行有一个白色像素是 176 - 与上面的红色框比较。现在我们可以找到最后一个白色像素,使用:

convert diff.jpg -scale 1x! -threshold 1% txt: | grep white | tail -1

0,415: (255,255,255) #FFFFFF white

我们知道第 415 行是边界框的底部。

现在您将图像压缩成一个只有 1 像素高的宽平面版本,并找到边界框的左右边界:

convert diff.jpg -scale x1! -threshold 1% txt: | grep -m1 white

80,0: (255,255,255) #FFFFFF white

convert diff.jpg -scale x1! -threshold 1% txt: | grep white | tail -1

343,0: (255,255,255) #FFFFFF white

所以你的边界框的左右限制是 80 和 343 - 根据红色矩形。

关于algorithm - 查找两个图像之间的不同区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26609395/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com