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

news2024/10/7 16:17:37

图片差异检测与标注

在图像处理领域中,检测两张图片之间的差异是一项重要的任务。本文将介绍一个使用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)
  • 原图
    在这里插入图片描述
  • 识别并画框
    在这里插入图片描述

3. 代码解释

3.1 图片预处理

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

3.2 图片差异计算

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

3.3 灰度化与阈值化

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

3.4 膨胀操作

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

3.5 轮廓检测

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

3.6 提取前5个差异区域

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

3.7 边界矩形提取与标注

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

4. 结论

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1460059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

缀点成线

1232. 缀点成线 给定一个数组 coordinates ,其中 coordinates[i] [x, y] , [x, y] 表示横坐标为 x、纵坐标为 y 的点。请你来判断,这些点是否在该坐标系中属于同一条直线上。 示例 1: 输入:coordinates [[1,2],[2,3…

分治算法总结(Java)

目录 分治算法概述 快速排序 练习1:排序数组 练习2:数组中的第K个最大元素 练习3:最小k个数 归并排序 练习4:排序数组 练习5:交易逆序对的总数 练习6:计算右侧小于当前元素的个数 练习7&#xff1…

Maven setting.xml 配置

目的:可以把我们书写的jar包发布到maven私有仓库,简称私仓 1. 打开云效 2.点击 非生产库-snapshot mave release仓库与snapshot仓库区别? 在软件开发中,"Maven release 仓库"和"Maven snapshot 仓库"是两种…

一周学会Django5 Python Web开发-Django5路由定义

锋哥原创的Python Web开发 Django5视频教程: 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计22条视频,包括:2024版 Django5 Python we…

Docker vs VM

关于应用程序的托管和开发,市场中的技术和产品琳琅满目。对比 Docker 和 VM,如何取舍?这主要由自身团队的因素决定,在选择 Docker 的情况下,你需要保证程序可在容器和虚拟机中运行。另外,成本和易用性也是重…

五种多目标优化算法(MOGWO、MOJS、NSWOA、MOPSO、MOAHA)性能对比(提供MATLAB代码)

一、5种多目标优化算法简介 1.1MOGWO 1.2MOJS 1.3NSWOA 1.4MOPSO 1.5MOAHA 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数(zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3)&#xff0…

C语言字符串函数strcpy与strncpy

注意: 这两个函数的功能,都是将 src 中的字符串,复制到 dest 中。strcpy() 没有边界控制,因此可能会由于 src 的过长而导致内存溢出。strncpy() 有边界控制,最多复制 n1 个字符(其中最后一个是 ‘\0’ &…

百度RT-DETR :基于视觉变换器的实时物体检测器

概述 实时检测转换器 (RT-DETR) 由百度开发,是一种尖端的端到端物体检测器,可在保持高精度的同时提供实时性能。它利用视觉转换器(ViT)的强大功能,通过解耦尺度内交互和跨尺度融合,高效处理多尺度特征。RT…

ALBEF算法解读

ALBEF论文全名Align before Fuse: Vision and Language Representation Learning with Momentum Distillation,来自于Align before Fuse,作者团队为Salesforce Research。 论文地址:https://arxiv.org/pdf/2107.07651.pdf 论文代码&#xff1…

跑批SQL性能异常分析

跑批是串行进行的,同时伴随着在线业务,整个跑批过程中只卡在SQL(6hqva0h4awrxh)执行环节上,相关等待事件为gc current grant 2-way,其他环节及在线业务都不受影响,主机整体资源较为空闲。最后通…

dockerfile文件书写

1.dockerfile构建nginx镜像 1.1书写dockerfile文件 mkdir nginx #创建nginx目录 cd nginx vim dockerfile # 修改文件FROM centos # 基础镜像,默认最新的centos8操作系统 MAINTAINER xianchao # 指定镜像的作者信息 RUN rm -rf /etc/yum.repos.d/* # centos8默认…

HTTP的详细介绍

目录 一、HTTP 相关概念 二、HTTP请求访问的完整过程 1、 建立连接 2、 接收请求 3、 处理请求 3.1 常见的HTTP方法 3.2 GET和POST比较 4、访问资源 5、构建响应报文 6、发送响应报文 7、记录日志 三、HTTP安装组成 1、常见http 服务器程序 2、apache介绍和特点 …

基于机器学习的青藏高原高寒沼泽湿地蒸散发插补研究_王秀英_2022

基于机器学习的青藏高原高寒沼泽湿地蒸散发插补研究_王秀英_2022 摘要关键词 1 材料和方法1.1 研究区概况与数据来源1.2 研究方法 2 结果和分析2.1 蒸散发通量观测数据缺省状况2.2 蒸散发与气象因子的相关性分析2.3 不同气象因子输入组合下各模型算法精度对比2.4 随机森林回归模…

对象的接口

“类”,那个类具有自己的通用特征与行为。 因此,在面向对象的程序设计中,尽管我们真正要做的是新建各种各样的数据“类型”(Type),但几乎所有面向对象的程序设计语言都采用了“class”关键字。当您看到“ty…

多线程相关(1)

线程调度 线程状态:状态切换阻塞与唤醒阻塞唤醒 wait 与 sleep创建线程方式 线程是cpu任务调度的最小执行单位,每个线程拥有自己独立的程序计数器、虚拟机栈、本地方法栈。 线程状态: 线程状态包括:创建、就绪、运行、阻塞、死亡…

第六十四天 服务攻防-框架安全CVE复现Apache shiroApache Solr

第六十四天 服务攻防-框架安全&CVE复现Apache shiro&Apache Solr 知识点: 中间件及框架列表: IIS,Apache,Nginx,Tomcat,Docker,K8s,Weblogic.JBoos,WebSphere, Jenkins,GlassFish,Jetty,Jira,Struts2,Laravel,Solr,Shiro,Thinkphp,Spring, Flask,jQuery等 1、开发框…

【rust】7、命令行程序实战:std::env、clap 库命令行解析、anyhow 错误库、indicatif 进度条库

文章目录 一、解析命令行参数1.1 简单参数1.2 数据类型解析-手动解析1.3 用 clap 库解析1.4 收尾 二、实现 grep 命令行2.1 读取文件,过滤关键字2.2 错误处理2.2.1 Result 类型2.2.2 UNwraping2.2.3 不需要 panic2.2.4 ? 问号符号2.2.5 提供错误上下文-自定义 Cust…

Vue 使用 v-bind 动态绑定 CSS 样式

在 Vue3 中&#xff0c;可以通过 v-bind 动态绑定 CSS 样式。 语法格式&#xff1a; color: v-bind(数据); 基础使用&#xff1a; <template><h3 class"title">我是父组件</h3><button click"state !state">按钮</button&…

相机图像质量研究(38)常见问题总结:编解码对成像的影响--呼吸效应

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

如何在同一个module里面集成多个数据库的多张表数据

确保本公司数据安全&#xff0c;通常对数据的管理采取很多措施进行隔离访问。 但是&#xff0c;Mendix应怎样访问散布于异地的多个数据库呢&#xff1f; 前几期我们介绍过出海跨境的大企业对于Mendix的技术、人才的诉求后&#xff0c;陆陆续续有其他客户希望更聚焦具体的实际场…