今天在一个群里,一个兄弟发起了一个讨论,两个线路板的图片,怎么能对比出两者的不同之处。
这里我暂时假设两张图片都是像素大小差不多标准化的图像,内容只有细微差异
(想一下如果差异太大,那还对比啥呢?)
大胆猜测一下大概率用于生产过程中的质量控制或者分类等场景;只要找到些许不同,人眼应该就能一眼判断是否需要继续下一步操作,所以找到不同之处之后还需要标记
。
这不就是以前我们常玩的游戏找不同吗?
让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.png
和 image2.png
4、执行脚本 diffimg.py
5、增加点难度,找一个找不同游戏里的照片进行对比,看看答案是否正确
改一改就能用了哦吼。
我是 StruggleYang,感谢关注
本文标题:对比图像内容差异并标记
文章作者:AwesomeYang
发布时间:2023-08-12
最后更新:2024-05-25
原始链接:https://struy.cn/2023/08/12/diff-images/
版权声明:未经允许禁止转载,请关注公众号联系作者