当前位置:   article > 正文

【Python】OpenCV-图片差异检测与标注_opencv 差异检测

opencv 差异检测

图片差异检测与标注

在图像处理领域中,检测两张图片之间的差异是一项重要的任务。本文将介绍一个使用OpenCV库进行图片差异检测的简单示例代码,并详细注释每个步骤。

1. 引言

图片差异检测是在两张图片之间寻找差异点或区域的过程。这项技术可用于监测图像变化,如运动物体的出现或图片内容的修改。在这个示例代码中,我们将演示如何使用OpenCV检测两张图片之间的差异,并标注出差异的区域。

2. 代码示例

以下是一个使用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)
  • 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
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 原图
    在这里插入图片描述
  • 识别并画框
    在这里插入图片描述

3. 代码解释

3.1 图片预处理

首先,对原始图像和目标图像进行高斯模糊,以减少噪声的影响。

3.2 图片差异计算

通过absdiff函数计算两张图像之间的差异,得到差异图像。

3.3 灰度化与阈值化

将差异图像转换为灰度图,并通过阈值化得到二值图像,以突出差异。

3.4 膨胀操作

通过膨胀操作,增强差异区域,便于后续轮廓检测。

3.5 轮廓检测

使用findContours函数寻找差异区域的轮廓,并计算每个轮廓的面积。

3.6 提取前5个差异区域

通过面积排序,提取前5个面积最大的差异区域。

3.7 边界矩形提取与标注

提取差异区域的边界矩形坐标,并在目标图像上标注出这些差异区域。

4. 结论

通过上述代码示例,我们演示了如何使用OpenCV进行图片差异检测,并在目标图像上标注出差异区域。这项技术在图像比对、监控系统等领域有着广泛的应用,可以用于检测图像中的变化,帮助用户及时发现异常情况。详细的注释有助于理解代码的每一步操作,为初学者提供了一个学习的起点。

代码参考源自:Shady的混乱空间

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/580915
推荐阅读
相关标签
  

闽ICP备14008679号