当前位置: 首页 > news >正文

将两张图片的不同标记出来

  1. 差异过于细微,阈值设置不当:您的差异可能是颜色或位置的微小变化,当前的阈值和处理方式可能不足以检测到这些细微差异。

  2. 图像配准不够精确:由于两张图片内容高度相似,特征点匹配可能存在误差,导致图像对齐不准确,影响差异检测。

  3. 灰度处理损失了颜色信息:如果差异体现在颜色上,转换为灰度图后,颜色变化可能被忽略。

  4. 形态学操作和面积过滤参数不合适:形态学处理和面积过滤的参数可能导致小的差异区域被过滤掉。


解决方案

1. 降低阈值,提高敏感度
  • 降低阈值:在阈值处理步骤中,将阈值从30降低到更小的值,如510,使得对细微差异更加敏感。

    _, thresh = cv2.threshold(diff, 5, 255, cv2.THRESH_BINARY)
    
2. 使用彩色图像进行差异检测
  • 直接计算彩色图像的差异:由于差异可能体现在颜色上,使用彩色图像的差异计算会更有效。

    # 计算彩色图像的差异
    diff_color = cv2.absdiff(img1_aligned, img2_color)
    # 转换为灰度图
    diff_gray = cv2.cvtColor(diff_color, cv2.COLOR_BGR2GRAY)
    # 阈值处理
    _, thresh = cv2.threshold(diff_gray, 5, 255, cv2.THRESH_BINARY)
    
3. 使用结构相似性(SSIM)
  • SSIM对细微差异更敏感:使用SSIM可以检测到亮度、对比度和结构上的微小变化。

    from skimage.metrics import structural_similarity as ssim# 计算SSIM
    score, diff = ssim(img1_aligned_gray, img2_gray, full=True)
    diff = (diff * 255).astype("uint8")
    diff = cv2.bitwise_not(diff)  # 反转图像
    # 阈值处理
    _, thresh = cv2.threshold(diff, 5, 255, cv2.THRESH_BINARY)
    

    注意:需要安装scikit-image库:

    pip install scikit-image
    
4. 调整形态学操作和面积阈值
  • 形态学操作:调整迭代次数和核大小,以保留更多细节。

    kernel = np.ones((3, 3), np.uint8)
    thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1)
    thresh = cv2.dilate(thresh, kernel, iterations=1)
    
  • 降低面积过滤阈值:减少cv2.contourArea()的阈值,确保小的差异区域也能被标记。

    if area > 5:  # 从50降低到5
    
5. 验证图像配准效果
  • 可视化匹配的特征点:检查特征点匹配是否准确。

    # 绘制前50个匹配点
    img_matches = cv2.drawMatches(img1_color, keypoints1, img2_color, keypoints2, good_matches[:50], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
    cv2.imshow('Matches', img_matches)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
  • 尝试其他特征检测器:如SIFTSURF,但需注意它们的许可证要求。


修改后的完整代码

import cv2
import numpy as np
from skimage.metrics import structural_similarity as ssim# 读取两张图片
img1_color = cv2.imread('find_difference_image1.png')  # 待配准的原始图像1
img2_color = cv2.imread('find_difference_image2.png')  # 基准的原始图像2# 检查图片是否成功读取
if img1_color is None or img2_color is None:print("错误:无法读取图片。请检查文件路径。")exit()# 将图片转换为灰度图
img1_gray = cv2.cvtColor(img1_color, cv2.COLOR_BGR2GRAY)
img2_gray = cv2.cvtColor(img2_color, cv2.COLOR_BGR2GRAY)# 创建ORB特征检测器
orb = cv2.ORB_create(10000)  # 增加特征点数量# 检测并计算特征点和描述子
keypoints1, descriptors1 = orb.detectAndCompute(img1_gray, None)
keypoints2, descriptors2 = orb.detectAndCompute(img2_gray, None)# 创建BFMatcher对象
bf = cv2.BFMatcher(cv2.NORM_HAMMING)# KNN匹配,k=2
matches = bf.knnMatch(descriptors1, descriptors2, k=2)# 过滤匹配结果,应用比值测试(Lowe's ratio test)
good_matches = []
for m, n in matches:if m.distance < 0.75 * n.distance:good_matches.append(m)# 检查是否有足够的匹配点
if len(good_matches) > 10:# 提取匹配的关键点坐标src_pts = np.float32([keypoints1[m.queryIdx].pt for m in good_matches]).reshape(-1, 1, 2)dst_pts = np.float32([keypoints2[m.trainIdx].pt for m in good_matches]).reshape(-1, 1, 2)# 计算Homography矩阵M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)# 将img1变换到img2的坐标系h, w = img2_gray.shapeimg1_aligned = cv2.warpPerspective(img1_color, M, (w, h))# 使用SSIM计算差异img1_aligned_gray = cv2.cvtColor(img1_aligned, cv2.COLOR_BGR2GRAY)score, diff = ssim(img1_aligned_gray, img2_gray, full=True)diff = (diff * 255).astype("uint8")diff = cv2.bitwise_not(diff)  # 反转图像# 阈值处理_, thresh = cv2.threshold(diff, 5, 255, cv2.THRESH_BINARY)# 使用形态学操作去除噪声和小的差异kernel = np.ones((3, 3), np.uint8)thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1)thresh = cv2.dilate(thresh, kernel, iterations=1)# 查找差异区域的轮廓contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 计算逆变换矩阵M_inv = np.linalg.inv(M)# 在原始的img1_color上绘制差异区域for contour in contours:area = cv2.contourArea(contour)if area > 5:# 将轮廓坐标转换为浮点型contour = contour.astype(np.float32)# 使用逆变换矩阵将坐标变换回img1的坐标系contour_transformed = cv2.perspectiveTransform(contour, M_inv)# 将坐标转换为整数contour_transformed = contour_transformed.astype(np.int32)# 绘制轮廓cv2.drawContours(img1_color, [contour_transformed], -1, (0, 0, 255), 2)# 在原始图像2上绘制差异区域for contour in contours:area = cv2.contourArea(contour)if area > 5:cv2.drawContours(img2_color, [contour], -1, (0, 0, 255), 2)# 调整图片大小以便显示img1_original_resized = cv2.resize(cv2.imread('find_difference_image1.png'), (400, 300))img2_original_resized = cv2.resize(cv2.imread('find_difference_image2.png'), (400, 300))img1_diff_resized = cv2.resize(img1_color, (400, 300))img2_diff_resized = cv2.resize(img2_color, (400, 300))# 将四张图片拼接成一张图片top_row = np.hstack((img1_original_resized, img2_original_resized))bottom_row = np.hstack((img1_diff_resized, img2_diff_resized))combined_image = np.vstack((top_row, bottom_row))# 显示组合后的图片cv2.imshow('Original and Difference Images', combined_image)cv2.waitKey(0)cv2.destroyAllWindows()
else:print("匹配点不足,无法计算Homography矩阵。")exit()

进一步的建议

  • 检查配准质量:使用cv2.drawMatches()可视化特征点匹配,确保配准准确。

  • 调整SSIM参数ssim()函数的参数可以调整,如gaussian_weightssigma等,以提高对细微差异的检测能力。

  • 尝试其他差异检测方法:如计算颜色直方图的差异,或者使用更高级的图像差异算法。

相关文章:

将两张图片的不同标记出来

差异过于细微&#xff0c;阈值设置不当&#xff1a;您的差异可能是颜色或位置的微小变化&#xff0c;当前的阈值和处理方式可能不足以检测到这些细微差异。 图像配准不够精确&#xff1a;由于两张图片内容高度相似&#xff0c;特征点匹配可能存在误差&#xff0c;导致图像对齐…...

HarmonyOS开发(State模型)

一、State模型概述 FA&#xff08;Feature Ability&#xff09;模型&#xff1a;从API 7开始支持的模型&#xff0c;已经不再主推。 Stage模型&#xff1a;从API 9开始新增的模型&#xff0c;是目前主推且会长期演进的模型。在该模型中&#xff0c;由于提供了AbilityStage、Wi…...

在 WPF 中使用 OpenTK:从入门到进阶

一、引言 WPF&#xff08;Windows Presentation Foundation&#xff09;是微软推出的用于创建丰富的桌面应用程序用户界面的框架。OpenTK 则为我们提供了强大的图形处理能力&#xff0c;包括 3D 图形渲染、数学计算等功能。将两者结合起来&#xff0c;可以在 WPF 应用程序中实…...

【最新华为OD机试E卷-支持在线评测】水仙花数(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…...

C# WinForm 用名字name字符串查找子控件

工作上遇到界面控件太多&#xff0c;需要对一些控件批量处理。虽然可以用代码批量控制&#xff0c;但要么是建立数组集合把所有要处理的控件放进去循环处理&#xff0c;要么是一个一个列出来修改属性。 但我大多数要求改的控件命名上是有规律的&#xff0c;所有只需要循环拼接字…...

Ubuntu下安装并初始化Git同时添加SSH密钥

在 Ubuntu 上可以使用以下命令安装git&#xff1a; sudo apt-get update sudo apt-get install git 在 Ubuntu 下安装好 Git 之后&#xff0c;接下来可以进行一些基本的配置和操作&#xff0c;以便更好地使用 Git。 1. 配置 Git 用户信息 在使用 Git 进行版本控制前&#x…...

好用的AI工具:探索智能生活的无限可能

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《热点时事》 期待您的关注 目录 引言 一&#xff1a;常用AI工具 1. 语音助手&#xff08;如Siri、小爱同学&#xff09; 2. 智…...

-bash: conda: command not found

-bash: conda: command not found 说明当前的终端环境中没有找到 conda 命令&#xff0c;可能是因为 Conda 没有安装&#xff0c;或者当前的环境变量中没有包含 Conda 的路径。 解决方法 确保 Conda 已安装 确认 Conda 路径是否添加到环境变量 如果 Conda 已安装&#xff0c;…...

STM32-CubeIDE用串口通讯

USART串口通讯 一、轮询模式 1.设置所接引脚为UART异步模式 选择完成CTRLS保存。 2.编写测试代码&#xff08;自动发送hello world&#xff09; 在mian函数里面编写代码 原函数 调用函数&#xff0c;需要数据类型一致&#xff0c;使用函数通过串口发送数组里面的数据 打开串…...

FloodFill 算法(DFS)

文章目录 FloodFill 算法&#xff08;DFS&#xff09;图像渲染岛屿数量岛屿的最大面积被围绕的区域太平洋大西洋水流问题扫雷游戏衣橱整理 FloodFill 算法&#xff08;DFS&#xff09; 漫水填充(Flood Fi)算法是一种图像处理算法&#xff0c;在计算机图形学和计算机视觉中被广泛…...

计算机通信与网络实验笔记

1.LINUX通过版本号判断是否为稳定版本 2.计网基础 &#xff08;CD&#xff09;&#xff0c;默认二层以太网交换机。 &#xff08;10&#xff09;物理层是均分&#xff08;除以&#xff09;&#xff0c;数据链路层及以上是不除的。 3.传输介质&#xff1a; &#xff08;1&…...

闲聊【干龙头】的重要性

市场面临转势&#xff0c;我们不知道谁会先涨&#xff0c;资金量大的操作必然会提前布局&#xff0c;而我们需要做的就是睁大眼睛&#xff0c;等待最强的那只股票出现&#xff0c;然后闭着眼睛进入就可以了。 追涨操作为什么都出现在大盘大涨情况下。原因简单&#xff0c;不能确…...

Ubuntu22.04安装RTX3080

Ubuntu22.04安装RTX3080 1 安装基础环境 更新依赖包 sudo apt-get update sudo apt-get upgrade2 安装驱动 &#xff08;1&#xff09;查看适合的显卡驱动 # 查看可用的驱动 sudo ubuntu-drivers devices# 返回值&#xff0c;推荐版本&#xff1a;nvidia-driver-550 ERROR…...

嵌入式学习-IO进程-Day04

嵌入式学习-IO进程-Day04 进程的函数接口 fork和Vfork 回收进程资源 wait waitpid 退出进程 获取进程号&#xff08;getpid&#xff0c;getppid&#xff09; 守护进程 守护进程的特点 创建步骤 exec函数族 线程 概念 线程和进程的区别 线程资源 线程函数接口 创建线程&#xff…...

RAII - 安卓中的智能指针

RAII - 安卓中的智能指针 概念 sp wp RefBase 是什么 system/core/libutils/RefBase.cpp system/core/libutils/include/utils/RefBase.hsystem/core/libutils/StrongPointer.cpp system/core/libutils/include/utils/StrongPointer.hAndroid在标准库之外&#xff0c;自定义…...

linux--库指令

ldd ldd 可执行文件路径 显示依赖的库的查找路径以及是否查找到了。...

展讯方案-内置多张开机logo

1. 开机图片的资源存放在logo分区中&#xff0c;这个分区中可以存放一个xx.bmp文件&#xff0c;也可以存放一个bin文件&#xff08;1logo.bin&#xff0c;包含多张压缩的图片集合&#xff09; 2.平台代码中logo.bin是由mk_1ogo_img.py脚本打包&#xff0c;具体如下&#xff08;…...

Stable Diffusion模型资源合集(附整合包)

&#xff08;模型资源在ComfyUI、WebUI以及ForgeUI中都通用&#xff09; 之前的Stable Diffusion笔记受到了不少小伙伴的关注&#xff0c;很感谢大家的建议和支持。有很多小伙伴私信我问我一些AI绘画的模型资源在哪来下载&#xff0c;一般来说有两个网站比较常用&#xff0c;分…...

机器学习|Pytorch实现天气预测

机器学习|Pytorch实现天气预测 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 电脑系统&#xff1a;Windows11 显卡型号&#xff1a;NVIDIA Quadro P620 语言环境&#xff1a;python 3.9.7 编译器&#x…...

【Kuberntes】k8s权限管理

文章目录 权限管理概述核心概念配置RBAC创建Role和ClusterRole创建RoleBinding和ClusterRoleBinding 默认角色和角色绑定权限的实现注意事项 如何在 Kubernetes 中实现 RBAC 的细粒度权限控制&#xff1f;1. Role和ClusterRole2. RoleBinding和ClusterRoleBinding3. 配置RBAC4.…...

C++,STL 033(24.10.15)

内容 queue容器&#xff08;队列&#xff09;的常用接口。 代码 #include <iostream> #include <string> #include <queue> // 注意包含queue容器&#xff08;队列&#xff09;的头文件using namespace std;class Person { public:string m_Name;int m_Age…...

AdmX_new

0x00前言 因为环境问题&#xff0c;此次靶场都放在vm上。都为NAT模式。 靶机地址: https://download.vulnhub.com/admx/AdmX_new.7z 需要找到两个flag文件。 0x01信息搜集 搜集IP 确认目标IP为172.16.8.131&#xff0c;进一步信息搜集 获取端口开放情况&#xff0c;版本信…...

【python3】函数注解

Python 函数注解 (Function Annotations) Python 函数注解 (Function Annotations)函数注解的基本语法基本语法格式示例 特殊类型注解注解信息的存储与访问函数注解的实际用途注意事项小结 函数注解是 Python 的一种特性&#xff0c;用于为函数的参数和返回值添加 元数据。注解…...

leetcode hot100 之【LeetCode 42. 接雨水】 java实现

LeetCode 42. 接雨水 题目描述 给定一个非负整数数组 height 表示柱状图中每个柱子的高度&#xff0c;请你计算按此排列的柱状图能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面的柱状图可以…...

10月18日,每日信息差

第一、现代汽车集团在上海举办了中国前瞻技术研发中心的发布及启新庆典&#xff0c;宣布成立其全资法人公司 —— 现代前瞻汽车技术开发&#xff08;上海&#xff09;有限公司。该中心是集团在海外建立的首个前瞻技术研发中心&#xff0c;专注于自动驾驶、智能座舱、共享出行等…...

Axure科技感元件:打造可视化大屏设计的得力助手

Axure&#xff0c;作为一款专业的原型设计工具&#xff0c;凭借其强大的设计功能、丰富的组件库和灵活的交互能力&#xff0c;成为了许多设计师打造科技感设计的首选工具。其中&#xff0c;Axure科技感元件更是以其独特的魅力和实用性&#xff0c;在数据可视化大屏、登录界面、…...

【模板】最近公共祖先(LCA)倍增

P3379 P3379 【模板】最近公共祖先&#xff08;LCA&#xff09; # 【模板】最近公共祖先&#xff08;LCA&#xff09; ## 题目描述 如题&#xff0c;给定一棵有根多叉树&#xff0c;请求出指定两个点直接最近的公共祖先。 ## 输入格式 第一行包含三个正整数 $N,M,S$&#…...

我的JAVA项目构建

1.Maven maven就是pip 设置maven下载的的jar包位置 换源 下载插件maven-search 配置dependency 2.Tomcat 设置环境变量JAVA_HOME 设置编码方式 方框就是路径的前缀 3.Servlet 新建项目 写一个类继承HttpServlet&#xff0c;复写doGet(应对Get请求)&#xff0c;doPost(应对…...

应用层协议 序列化

自定义应用层协议 例子&#xff1a;网络版本计算器 序列化反序列化 序列化&#xff1a;将消息&#xff0c;昵称&#xff0c;日期整合成消息-昵称-日期 反序列化&#xff1a;消息-昵称-日期->消息&#xff0c;昵称&#xff0c;日期 在序列化中&#xff0c;定义一个结构体…...

【HAD】Half-Truth: A Partially Fake Audio Detection Dataset

文章目录 Half-Truth: A Partially Fake Audio Detection Dataset背景key points研究数据集设计评价指标实验基线:utterance-level分类(话语级)基线:segment-level分类(片段级)Half-Truth: A Partially Fake Audio Detection Dataset 会议/期刊:Interspeech 2021 CCF-C…...