• 【Python】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的混乱空间

  • 相关阅读:
    python爬虫涨姿势板块
    科技云报道:云安全的新战场上,如何打破“云威胁”的阴霾?
    【VisDrone数据集】YOLOX训练VisDrone数据集步骤与结果
    计及需求响应的粒子群算法求解风能、光伏、柴油机、储能容量优化配置(Matlab代码实现)
    全国爱眼教育大会,2022第四届北京国际青少年眼健康产业展会
    Tomcat工作原理 + Tomcat生命周期实现剖析(下期)
    x-pack的破解方式和免费jar包!!可直接用!!
    Linux内核的配置和编译(2)——Linux内核下载与配置
    C++项目-通讯录管理系统
    目前工业界常用的推荐系统模型有哪些?
  • 原文地址:https://blog.csdn.net/linjiuxiansheng/article/details/136201157