赞
踩
在图像处理领域中,检测两张图片之间的差异是一项重要的任务。本文将介绍一个使用OpenCV库进行图片差异检测的简单示例代码,并详细注释每个步骤。
图片差异检测是在两张图片之间寻找差异点或区域的过程。这项技术可用于监测图像变化,如运动物体的出现或图片内容的修改。在这个示例代码中,我们将演示如何使用OpenCV检测两张图片之间的差异,并标注出差异的区域。
以下是一个使用OpenCV的图片差异检测示例代码,其中包含了详细的注释:
import cv2 import numpy as np def detect(src_img, dst_img): # 对原始图像和目标图像进行高斯模糊,以减少噪声影响 src_img = cv2.GaussianBlur(src_img, [5, 5], 0) dst_img = cv2.GaussianBlur(dst_img, [5, 5], 0) # 计算两张图像的差异 diff = cv2.absdiff(src_img, dst_img) # 转换为灰度图 gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY) # 应用阈值化,得到二值图像 _, result = cv2.threshold(gray, 20, 255, cv2.THRESH_BINARY) # 对二值图像进行膨胀,突出差异区域 result = cv2.dilate(result, np.ones([5, 5])) # 寻找差异区域的轮廓 contours, _ = cv2.findContours(result, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) areas = [] # 计算轮廓面积 for c in contours: area = cv2.contourArea(c) areas.append(area) areas = np.array(areas) # 获取面积最大的5个轮廓 index = np.argsort(areas)[-5:] top5_contours = [] rect_pos = [] # 提取前5个轮廓,并获取其边界矩形的坐标 for i in range(5): top5_contours.append(contours[index[i]]) for c in top5_contours: # x y w h rect_pos.append(cv2.boundingRect(c)) return rect_pos # 读取原始图像和目标图像 src_img = cv2.imread("src_img.jpg") dst_img = cv2.imread("dst_img.jpg") # 调用差异检测函数,获取差异区域的矩形坐标 rects = detect(src_img, dst_img) # 在目标图像上标注差异区域 for x, y, w, h in rects: cv2.rectangle(dst_img, [x, y], [x + w, y + h], [0, 0, 255], 3) # 显示原始图像和标注差异的目标图像 cv2.imshow("src_img", src_img) cv2.imshow("dst_img", dst_img) cv2.waitKey(0)
首先,对原始图像和目标图像进行高斯模糊,以减少噪声的影响。
通过absdiff
函数计算两张图像之间的差异,得到差异图像。
将差异图像转换为灰度图,并通过阈值化得到二值图像,以突出差异。
通过膨胀操作,增强差异区域,便于后续轮廓检测。
使用findContours
函数寻找差异区域的轮廓,并计算每个轮廓的面积。
通过面积排序,提取前5个面积最大的差异区域。
提取差异区域的边界矩形坐标,并在目标图像上标注出这些差异区域。
通过上述代码示例,我们演示了如何使用OpenCV进行图片差异检测,并在目标图像上标注出差异区域。这项技术在图像比对、监控系统等领域有着广泛的应用,可以用于检测图像中的变化,帮助用户及时发现异常情况。详细的注释有助于理解代码的每一步操作,为初学者提供了一个学习的起点。
代码参考源自:Shady的混乱空间
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。