对比图像内容差异并标记

今天在一个群里,一个兄弟发起了一个讨论,两个线路板的图片,怎么能对比出两者的不同之处。

这里我暂时假设两张图片都是像素大小差不多标准化的图像,内容只有细微差异(想一下如果差异太大,那还对比啥呢?)

大胆猜测一下大概率用于生产过程中的质量控制或者分类等场景;只要找到些许不同,人眼应该就能一眼判断是否需要继续下一步操作,所以找到不同之处之后还需要标记

这不就是以前我们常玩的游戏找不同吗?

让ChatGPT为我们工作

因为没有专门学习这方面的知识,所以尝试问了一下 ChatGPT ,并检查它生成的代码是否能直接运行。

需求: 输入两张图,对比差异,标记差异

由于我的确不知道需要使用什么库去做就不限定使用库了,直接说需求。

请使用 Python 编写一个程序,对比两张图片,并在后一张图上标记出差异

ChatGPT答: 要使用Python比较两张图并在后一张图上标记差异,你可以使用OpenCV和Matplotlib库。下面是一个简单的示例代码:

import cv2
import numpy as np
import matplotlib.pyplot as plt

def compare_images(image1, image2):
    # 加载两张图像
    img1 = cv2.imread(image1)
    img2 = cv2.imread(image2)

    # 将图像转换为灰度图
    gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
    gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

    # 计算两张图像的差异
    diff = cv2.absdiff(gray1, gray2)
    _, threshold = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)

    # 查找差异的轮廓
    contours, _ = cv2.findContours(threshold, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    # 在第二张图像上绘制差异的轮廓
    marked_image = img2.copy()
    for contour in contours:
        (x, y, w, h) = cv2.boundingRect(contour)
        cv2.rectangle(marked_image, (x, y), (x + w, y + h), (0, 255, 0), 2)

    # 显示图像
    plt.subplot(1, 3, 1)
    plt.imshow(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB))
    plt.title('Image 1')
    plt.axis('off')

    plt.subplot(1, 3, 2)
    plt.imshow(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB))
    plt.title('Image 2')
    plt.axis('off')

    plt.subplot(1, 3, 3)
    plt.imshow(cv2.cvtColor(marked_image, cv2.COLOR_BGR2RGB))
    plt.title('Differences')
    plt.axis('off')

    plt.tight_layout()
    plt.show()

# 比较两张图像并标记出差异
compare_images('image1.png', 'image2.png')

请确保已安装所需的库(OpenCV和Matplotlib),并将image1.png和image2.png替换为你要比较的实际图像的文件路径。此代码将显示两张原始图像以及第二张图像上标记出的差异。

验证程序

1、拷贝程序代码到脚本文件,命名为diffimg.py

2、安装必要的依赖库,主要是 OpenCV 进行图像 diff

pip3 install opencv-python

3、找一张图拷贝一份,并对任意一张图像做任意修改,并分别命名为程序所需命名 image1.pngimage2.png

增加一个小红点,人眼很容易看的出来

4、执行脚本 diffimg.py

python3 diffimg.py

运行对比结果,效果不错

5、增加点难度,找一个找不同游戏里的照片进行对比,看看答案是否正确

还是很精准的

改一改就能用了哦吼。

我是 AwesomeYang,感谢关注