使用可变阈值检测两个图像的差异

Detect differences in two image with variable threshold

我正在开发一个 python 程序来检测一张图片与另一张图片相比是否缺少某些内容。基本上,它应该拍摄一个地方的照片,保存它,然后每当我们 运行 程序时,它应该从同一个地方的相机拍摄照片并将它们与我们之前保存的照片进行比较以检测是否图片中缺少对象。

要求:

例如,我们拍了一张地板的参考照片,地上有两个苹果和一个橘子,然后保存该照片以备将来参考。 之后,我们从地上拿了一个苹果,现在地上只有一个苹果和一个橘子。当我们 运行 程序时,它应该使用相机拍摄一张照片并将该照片与我们之前拍摄的照片进行比较。它应该检测到图片的某个区域(放置丢失的苹果的地方)与新图片不同,并提醒用户(打印消息)...这就是整个想法。

这是我目前的成就:

我使用了 Pillow 库中名为 ImageChops 的工具。它的问题在于它甚至可以检测到由于噪声而可能发生的非常小的变化。但我希望它能够检测到重大变化,例如缺少或添加到图片中的对象。我也想用一个阈值来控制它。我在互联网上搜索过这样做,但找不到任何有用的东西。这是我使用的代码

from PIL import Image, ImageChops
import cv2
import os
import sys

img1 = Image.open('1.jpg')
img2 = Image.open('2.jpg')

diff = ImageChops.difference(img1, img2)
if diff.getbbox():
    print("Total {} differences found".format(diff.getbbox()))
    diff.show()
else:
    print('No difference found')

如果有人能指出正确的方向,我将不胜感激。谢谢

您描述的一般问题称为“特征匹配”。 OpenCV 有很多工具可用于此目的:一种简单的方法是 https://docs.opencv.org/4.x/dc/dc3/tutorial_py_matcher.html,它比较两个图像之间的 ORB 特征(基本上是广义角点)。与直接比较像素值相比,这些类型的特征对光照和噪声更稳健。