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

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

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

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

让ChatGPT为我们工作

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

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

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


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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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

1
pip3 install opencv-python

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

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

4、执行脚本 diffimg.py

1
python3 diffimg.py

运行对比结果,效果不错

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

还是很精准的

改一改就能用了哦吼。

我是 StruggleYang,感谢关注