选题(2)
47 找出两幅图像中不同的地方,并在不同处用方框标出
要求:对两幅找茬图像进行对比,找出图像中不同的地方,并在不同处用方框标出。
试验图片

参考步骤:
解:
使用Python代码解决问题,使用OpenCV实现上述需求。该代码将对比两幅图像,找出它们之间的不同之处,并在不同区域周围画出红色的方框,同时统计不同区域的个数、位置坐标和大小。
请确保你的计算机上已安装OpenCV库。如果没有安装,可以使用以下命令进行安装:
pip install opencv-python
import cv2
import numpy as np
# 读取两幅待比较的图像
image1 = cv2.imread('image1.jpg')
image2 = cv2.imread('image2.jpg')
# 确保两幅图像具有相同的尺寸
if image1.shape != image2.shape:
print("Error: Images must have the same dimensions.")
exit()
# 将图像转换为灰度图
gray1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)
# 计算图像的绝对差异
diff = cv2.absdiff(gray1, gray2)
# 二值化差异图像
_, thresh = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)
# 扩大二值化图像以填补孔洞
thresh = cv2.dilate(thresh, None, iterations=2)
# 查找轮廓
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 统计不同区域的个数和大小,并在原图中绘制方框
num_differences = 0
regions = []
for contour in contours:
area = cv2.contourArea(contour)
if area > 500: # 过滤小区域
x, y, w, h = cv2.boundingRect(contour)
cv2.rectangle(image1, (x - 5, y - 5), (x + w + 5, y + h + 5), (0, 0, 255), 2) # 红色方框
regions.append((x, y, w, h, area))
num_differences += 1
# 输出结果
print(f'发现 {num_differences} 个不同区域。')
for region in regions:
x, y, w, h, area = region
print(f'区域位置: ({x}, {y}), 大小: {w}x{h}, 面积: {area}')
# 显示结果图像
cv2.imshow("Differences", image1)
cv2.imshow("Threshold", thresh)
# 按任意键退出
cv2.waitKey(0)
cv2.destroyAllWindows()
代码说明
- 读取图像: 代码将两幅待比较的图像加载到内存中并确保它们的尺寸相同。
- 灰度转换: 将图像转换为灰度图,以便后续处理。
- 计算差异: 通过逐像素计算绝对差异,得到一幅显示两幅图像不同之处的差异图。
- 二值化: 对差异图进行二值化处理,以突出显示不同的地方。
- 膨胀处理: 使用
dilate扩大二值化后的图像,填补孔洞。 - 轮廓检测: 使用
findContours检测不同区域的轮廓,并计算每个区域的面积。 - 绘制方框: 对于足够大的不同区域,在图像上绘制红色方框,方框的大小扩展了5个像素。
- 统计和输出: 输出不同区域的数量、位置和大小。
- 显示结果: 使用OpenCV的
imshow展示带有标记的图像和二值化的差异图。
注意事项
- 请确保图像路径和文件名正确。
- 根据需要调整二值化阈值和面积过滤条件。



4524

被折叠的 条评论
为什么被折叠?



