Python OpenCV精讲系列 - 高级图像处理技术(五)

在这里插入图片描述

💖💖⚡️⚡️专栏:Python OpenCV精讲⚡️⚡️💖💖
本专栏聚焦于Python结合OpenCV库进行计算机视觉开发的专业教程。通过系统化的课程设计,从基础概念入手,逐步深入到图像处理、特征检测、物体识别等多个领域。适合希望在计算机视觉方向上建立坚实基础的技术人员及研究者。每一课不仅包含理论讲解,更有实战代码示例,助力读者快速将所学应用于实际项目中,提升解决复杂视觉问题的能力。无论是入门者还是寻求技能进阶的开发者,都将在此收获满满的知识与实践经验。

1. 特征检测

特征检测用于在图像中寻找具有独特性的区域或点,这些特征可以在不同的图像之间进行匹配。

1.1 SIFT (Scale-Invariant Feature Transform)

SIFT 是一种用于检测和描述图像中的关键点的方法。

sift = cv2.SIFT_create()
keypoints, descriptors = sift.detectAndCompute(image, None)
  • 参数

    • image:输入图像。
  • 返回值

    • keypoints:检测到的关键点列表。
    • descriptors:对应关键点的描述符。
  • 详细解释

    • 原理

      • SIFT 算法通过检测尺度不变的关键点来识别图像中的特征。
      • 关键点是具有独特性的点,它们在不同的视角和光照条件下仍然可以被识别。
      • 描述符是关键点周围区域的特征表示,用于后续的匹配。
    • 应用

      • SIFT 常用于图像配准、对象识别、三维重建等任务。
      • SIFT 特征具有尺度不变性和旋转不变性,因此非常适合于图像匹配任务。
    • 注意事项

      • SIFT 计算较为耗时,不适合实时应用。
      • SIFT 描述符较长(128维),占用内存较多。
    • 实现细节

      • SIFT 算法首先构建尺度空间,检测关键点。
      • 接着计算关键点的方向,使其具有旋转不变性。
      • 最后生成描述符,用于描述关键点周围的区域。
    • 局限性

      • SIFT 对于快速移动的物体或低光照条件下的图像可能表现不佳。
      • SIFT 可能无法处理大规模的图像变形或旋转。
1.2 SURF (Speeded Up Robust Features)

SURF 是一种更快的特征检测和描述方法。

surf = cv2.SURF_create(hessianThreshold)
keypoints, descriptors = surf.detectAndCompute(image, None)
  • 参数

    • image:输入图像。
    • hessianThreshold:Hessian 阈值,用于控制关键点的数量。
  • 返回值

    • keypoints:检测到的关键点列表。
    • descriptors:对应关键点的描述符。
  • 详细解释

    • 原理

      • SURF 算法通过近似 SIFT 的高斯金字塔来加速关键点检测过程。
      • SURF 也具有尺度不变性和旋转不变性,但在速度上优于 SIFT。
    • 应用

      • SURF 常用于图像配准、对象识别、三维重建等任务。
      • SURF 特征在实时应用中更为实用。
    • 注意事项

      • SURF 的 Hessian 阈值会影响检测到的关键点数量。
      • SURF 描述符比 SIFT 短(64维),占用内存较少。
    • 实现细节

      • SURF 算法使用积分图像来加速关键点检测。
      • 使用 Hessian 阈值来筛选关键点,降低计算量。
      • 生成描述符,用于描述关键点周围的区域。
    • 局限性

      • SURF 在某些情况下可能不如 SIFT 精确。
      • SURF 对于大规模的图像变形或旋转可能表现不佳。
1.3 ORB (Oriented FAST and Rotated BRIEF)

ORB 是一种快速且高效的特征检测和描述方法。

orb = cv2.ORB_create(nfeatures)
keypoints, descriptors = orb.detectAndCompute(image, None)
  • 参数

    • image:输入图像。
    • nfeatures:要检测的最大关键点数量。
  • 返回值

    • keypoints:检测到的关键点列表。
    • descriptors:对应关键点的描述符。
  • 详细解释

    • 原理

      • ORB 算法结合了 FAST 关键点检测和 BRIEF 描述符。
      • ORB 特征具有旋转不变性,并且计算速度快。
    • 应用

      • ORB 常用于实时应用,如机器人导航、增强现实等。
      • ORB 特征适合于需要高速处理的场景。
    • 注意事项

      • ORB 的 nfeatures 参数决定了检测到的关键点数量。
      • ORB 描述符较短(32位),占用内存较少。
    • 实现细节

      • 使用 FAST 算法检测关键点。
      • 使用 BRIEF 描述符来描述关键点周围的区域。
      • ORB 通过计算关键点的方向来实现旋转不变性。
    • 局限性

      • ORB 在某些情况下可能不如 SIFT 或 SURF 精确。
      • ORB 对于大规模的图像变形或旋转可能表现不佳。

在这里插入图片描述

2. 图像配准

图像配准是指将两幅或多幅图像对齐的过程,通常用于图像融合、三维重建等任务。

2.1 基于特征的配准

基于特征的配准利用特征点进行图像配准。

# 检测特征点
sift = cv2.SIFT_create()
kp1, des1 = sift.detectAndCompute(image1, None)
kp2, des2 = sift.detectAndCompute(image2, None)# 匹配特征点
matcher = cv2.BFMatcher()
matches = matcher.knnMatch(des1, des2, k=2)# 应用比率测试
good_matches = []
for m, n in matches:if m.distance < 0.7 * n.distance:good_matches.append(m)# 计算变换矩阵
src_pts = np.float32([kp1[m.queryIdx].pt for m in good_matches]).reshape(-1, 1, 2)
dst_pts = np.float32([kp2[m.trainIdx].pt for m in good_matches]).reshape(-1, 1, 2)
M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)# 应用变换
aligned_image = cv2.warpPerspective(image1, M, (image2.shape[1], image2.shape[0]))
  • 详细解释
    • 原理

      • 首先使用特征检测器(如 SIFT、SURF 或 ORB)检测两幅图像中的特征点。
      • 使用匹配器(如 BFMatcher)匹配两幅图像中的特征点。
      • 应用比率测试来过滤匹配点,确保只有最好的匹配被保留。
      • 使用 RANSAC 方法估计变换矩阵。
      • 应用变换矩阵将一幅图像对齐到另一幅图像上。
    • 应用

      • 图像配准可用于图像融合、全景图制作、三维重建等任务。
      • 基于特征的配准适用于两幅图像间有足够多的共同特征点的情况。
    • 注意事项

      • 特征检测器的选择会影响匹配的准确性。
      • 匹配器的选择和参数设置会影响匹配效果。
      • RANSAC 参数的选择会影响变换矩阵的精度。
    • 实现细节

      • 使用特征检测器检测关键点,并生成描述符。
      • 使用匹配器匹配两幅图像中的特征点。
      • 使用比率测试来过滤匹配点,确保匹配质量。
      • 使用 RANSAC 方法估计最优的变换矩阵。
      • 应用变换矩阵将一幅图像对齐到另一幅图像上。
    • 局限性

      • 如果两幅图像间没有足够的共同特征点,配准可能失败。
      • 如果两幅图像间存在较大的变形或旋转,配准可能不准确。

在这里插入图片描述

3. 图像拼接

图像拼接是指将多幅图像合成一幅大图像的过程,通常用于创建全景图。

# 检测特征点
sift = cv2.SIFT_create()
kp1, des1 = sift.detectAndCompute(image1, None)
kp2, des2 = sift.detectAndCompute(image2, None)# 匹配特征点
matcher = cv2.BFMatcher()
matches = matcher.knnMatch(des1, des2, k=2)# 应用比率测试
good_matches = []
for m, n in matches:if m.distance < 0.7 * n.distance:good_matches.append(m)# 计算变换矩阵
src_pts = np.float32([kp1[m.queryIdx].pt for m in good_matches]).reshape(-1, 1, 2)
dst_pts = np.float32([kp2[m.trainIdx].pt for m in good_matches]).reshape(-1, 1, 2)
M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)# 应用变换
aligned_image = cv2.warpPerspective(image1, M, (image2.shape[1] + image1.shape[1], max(image1.shape[0], image2.shape[0])))# 合并图像
result_image = np.zeros_like(aligned_image)
result_image[:image2.shape[0], :image2.shape[1]] = image2
result_image[:aligned_image.shape[0], :aligned_image.shape[1]] = aligned_image# 融合重叠区域
overlap = result_image[:image2.shape[0], :image2.shape[1]]
mask = overlap.sum(axis=2) > 0
result_image[:image2.shape[0], :image2.shape[1]][mask] = overlap[mask]# 显示结果
cv2.imshow('Result Image', result_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 详细解释
    • 原理

      • 使用特征检测器(如 SIFT、SURF 或 ORB)检测两幅图像中的特征点。
      • 使用匹配器(如 BFMatcher)匹配两幅图像中的特征点。
      • 应用比率测试来过滤匹配点,确保只有最好的匹配被保留。
      • 使用 RANSAC 方法估计变换矩阵。
      • 应用变换矩阵将一幅图像对齐到另一幅图像上。
      • 合并对齐后的图像,并融合重叠区域。
    • 应用

      • 图像拼接可用于创建全景图、大视场图像等。
      • 图像拼接适用于需要合成多幅图像的情况。
    • 注意事项

      • 特征检测器的选择会影响匹配的准确性。
      • 匹配器的选择和参数设置会影响匹配效果。
      • RANSAC 参数的选择会影响变换矩阵的精度。
      • 合并图像时需要注意重叠区域的处理。
    • 实现细节

      • 使用特征检测器检测关键点,并生成描述符。
      • 使用匹配器匹配两幅图像中的特征点。
      • 使用比率测试来过滤匹配点,确保匹配质量。
      • 使用 RANSAC 方法估计最优的变换矩阵。
      • 应用变换矩阵将一幅图像对齐到另一幅图像上。
      • 合并对齐后的图像,并融合重叠区域。
    • 局限性

      • 如果两幅图像间没有足够的共同特征点,拼接可能失败。
      • 如果两幅图像间存在较大的变形或旋转,拼接可能不准确。

在这里插入图片描述

4. 综合示例

接下来,我们将结合上述几种技术,创建一个综合示例。在这个示例中,我们将读取两张图像,使用 SIFT 检测特征点,进行图像配准,最后进行图像拼接,创建全景图。

import cv2
import numpy as npdef stitch_images(image1_path, image2_path):# 读取图像image1 = cv2.imread(image1_path)image2 = cv2.imread(image2_path)if image1 is None or image2 is None:print("Error: Files not found!")return# 特征检测sift = cv2.SIFT_create()kp1, des1 = sift.detectAndCompute(image1, None)kp2, des2 = sift.detectAndCompute(image2, None)# 匹配特征点matcher = cv2.BFMatcher()matches = matcher.knnMatch(des1, des2, k=2)# 应用比率测试good_matches = []for m, n in matches:if m.distance < 0.7 * n.distance:good_matches.append(m)# 计算变换矩阵src_pts = np.float32([kp1[m.queryIdx].pt for m in good_matches]).reshape(-1, 1, 2)dst_pts = np.float32([kp2[m.trainIdx].pt for m in good_matches]).reshape(-1, 1, 2)M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)# 应用变换aligned_image = cv2.warpPerspective(image1, M, (image2.shape[1] + image1.shape[1], max(image1.shape[0], image2.shape[0])))# 合并图像result_image = np.zeros_like(aligned_image)result_image[:image2.shape[0], :image2.shape[1]] = image2result_image[:aligned_image.shape[0], :aligned_image.shape[1]] = aligned_image# 融合重叠区域overlap = result_image[:image2.shape[0], :image2.shape[1]]mask = overlap.sum(axis=2) > 0result_image[:image2.shape[0], :image2.shape[1]][mask] = overlap[mask]# 显示结果cv2.imshow('Result Image', result_image)cv2.waitKey(0)cv2.destroyAllWindows()if __name__ == "__main__":image1_path = 'path/to/your/image1.jpg'image2_path = 'path/to/your/image2.jpg'stitch_images(image1_path, image2_path)
5. 小结

在本篇文章中,我们详细介绍了如何使用OpenCV进行特征检测、图像配准以及图像拼接。这些技术在计算机视觉领域非常重要,并且是许多高级应用的基础。接下来的文章将涉及更复杂的图像处理技术,如目标检测、语义分割等。

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

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

相关文章

使用 Elastic 和 LM Studio 的 Herding Llama 3.1

作者&#xff1a;来自 Elastic Charles Davison, Julian Khalifa 最新的 LM Studio 0.3 更新使 Elastic 的安全 AI Assistant 能够更轻松、更快速地与 LM Studio 托管模型一起运行。在这篇博客中&#xff0c;Elastic 和 LM Studio 团队将向你展示如何在几分钟内开始使用。如果你…

【UE5 C++课程系列笔记】02——创建C++类的三种方式

目录 一、从UE编辑器中创建 引用头文件报错的两种解决方式 &#xff08;1&#xff09;方式1 &#xff08;2&#xff09;方式2 二、在文件夹中直接创建 三、在Visual Studio中创建 一、从UE编辑器中创建 在UE编辑器中选择“Tools-》New C Class” 这里新建的类的父类选择…

解锁阿尔茨海默病(AD)靶点密码,开启靶向治疗新篇章

前 言&#xff1a; 阿尔茨海默病&#xff08;AD&#xff09;是一种严重的神经退行性疾病&#xff0c;多发于高龄人群&#xff0c;主要表现为记忆、思维、分析判断、视空间辨认、情绪等障碍。从实验室到临床应用的过程充满挑战。阿尔茨海默症新型疗法的开发主要聚焦于靶向Aβ、…

Vue3.0项目实战(三)——大事件管理系统首页 layout 架子与文章分类的实现

目录 1. 首页 layout 架子 [element-plus 菜单] 1.1 基本架子拆解 2. 登录访问拦截 2.1 需求 2.2 vue3 和 vue2 中的 Vue-Router 区别 3. 用户基本信息获取&渲染 4. 退出功能 [element-plus 确认框] 5. 文章分类页面 - [element-plus 表格] 5.1 基本架子 - PageCo…

专业版PyCharm使用plt.show()显示图像时,如何不显示在右侧工具栏中,而是直接弹出来

解决方案 File -> Settings -> Python Plots -> 取消勾选 Show plots in tool window 示例 默认勾选 Show plots in tool window 的显示效果&#xff1a; 取消勾选 Show plots in tool window 的显示效果&#xff1a;

伙房食堂电气安全新挑战:油烟潮湿环境下,如何筑起电气火灾“防火墙”?

近几年&#xff0c;随着我国经济的飞速发展&#xff0c;食堂餐饮也经历了一场变革&#xff0c;越来越多的电器走进了伙房食堂中&#xff0c;实现了电气化&#xff0c;为人们提供了高效便利的饮食服务&#xff0c;但同时也增加了火灾负荷。目前我国非常严重的电气火灾危害&#…

使用 Parallel 类进行多线程编码(下)

2.Parallel.ForEach() 的使用 从 ForEach() 这个名字可以看出该方法是用来遍历泛型集合的&#xff0c;新建一个 ASP.NET Core Web应用的项目&#xff0c;如下&#xff1a; 在 Index.cshtml.cs 文件中增加一个 UserInfo.cs 的类&#xff0c;代码如下&#xff1a; public class U…

组合逻辑电路的分析

目录 组合逻辑电路的分析 分析思路 基本步骤 例题1 例题2 组合逻辑电路的分析 分析思路 基本步骤 例题1 将每个门的输出命名。 写出逻辑函数式。 列真值表。 ABC全一致输出为1。 例题2 观察发现这三个结构是一样的。 逐级写出逻辑函数式&#xff1a; 发现这其实就是异或…

基于云端的跨平台个人信息管理系统

博主介绍&#xff1a;专注于Java .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的可以…

无线麦克风哪款好用,手机领夹麦克风哪个牌子好,麦克风推荐

随着短视频与直播行业的蓬勃发展&#xff0c;无线领夹麦克风市场迎来了前所未有的繁荣。品牌如罗德、大疆、西圣等麦克风品牌凭借卓越的技术实力与品牌影响力占据了市场的主导地位&#xff0c;其中西圣更是凭借其高性价比和用户口碑&#xff0c;稳居行业口碑品牌前列。但在这光…

Chainlit集成Langchain并使用通义千问实现文生图网页应用

前言 本文教程如何使用通义千问的大模型服务平台的接口&#xff0c;实现图片生成的网页应用&#xff0c;主要用到的技术服务有&#xff0c;chainlit 、 langchain、 flux。合利用了大模型的工具选择调用能力。实现聊天对话生成图片的网页应用。 阿里云 大模型服务平台百炼 API…

最新融合多模态的理解和生成的大一统transform架构,show-o模型部署

Show-o是由字节跳动和新加坡国立大学Show Lab共同研发的一个多模态大模型&#xff0c;统一了多模态理解和生成。 Show-o的创新之处在于它将自回归和离散扩散建模相结合&#xff0c;以适应不同和混合模态的输入和输出。 Show-o模型的架构基于预训练的大型语言模型&#xff08;…

web基础之SSRF

1、内网访问 题目提示&#xff1a;访问位于127.0.0.1的flag.php&#xff1b;直接利用ssrf漏洞访问?url127.0.0.1/flag.php 2、伪协议读取文件 &#xff08;1&#xff09;题目提示&#xff1a;尝试去读取一下Web目录下的flag.php吧 &#xff08;2&#xff09;什么是伪协议&a…

【鸿蒙】HarmonyOS NEXT星河入门到实战6-组件化开发-样式结构重用常见组件

目录 1、Swiper轮播组件 1.1 Swiper基本用法 1.2 Swiper的常见属性 1.3 Swiper的样式自定义 1.3.1 基本语法 1.3.2 案例小米有品 2、样式&结构重用 2.1 Extend:扩展组件(样式、事件) 2.2 Styles:抽取通用属性、事件 2.3 Builder:自定义构建函数(结构、样式、事…

无人机视角-道路目标检测数据集 航拍 8600张 voc yolo

数据集名称&#xff1a; 无人机视角-道路目标检测数据集 数据集规模&#xff1a; 图像数量&#xff1a;8600张拍摄方式&#xff1a;航拍&#xff08;使用无人机拍摄&#xff09;标注格式&#xff1a;支持VOC和YOLO格式 数据集内容&#xff1a; 该数据集由无人机从空中拍摄的…

Android10源码刷入Pixel2以及整合GMS

一、ASOP源码下载 具体可以参考我之前发布的文章 二、下载相关驱动包 这一步很关键,关系到编译后的镜像能否刷入后运行 下载链接:Nexus 和 Pixel 设备的驱动程序二进制文件 如下图所示,将两个驱动程序上传到Ubuntu服务器,并进行解压,得到两个脚本: 下载解压后会有两…

5.qml 如何管理好控制台打印输出

c 在工程文件里面加入&#xff0c;这个只是禁用了c端的打印 DEFINES QT_NO_WARNING_OUTPUT DEFINES QT_NO_DEBUG_OUTPUT qml 在pro里面添加 #CONFIG - declarative_debug #CONFIG - qml_debug DEFINES QT_QML_DEBUG_NO_WARNING禁用qml打印,在main.cpp中引入 qputenv…

git为不同的项目设置不同的提交作者

方法1&#xff1a;找到项目的.git文件夹打开 打开config在下面添加自己作者信息 [user]name 作者名email 邮箱方法2&#xff1a;直接在.git文件夹设置作者名&#xff08;不使用–global参数&#xff09; git config user.name "xxxxx"如果想要修改之前提交的…

【idea-安装】

JetBrains官⽹ : https://www.jetbrains.com/ 1.下载idea安装包&#xff0c;下载旧一些的版本&#xff0c;避免新版本的不稳定。 下载下来的安装包是exe格式的&#xff0c;直接点击运行。 点击Next 2.选择要下载的位置&#xff0c;点击下一步。 3.选择⽣成快捷⽅式和建⽴⽂件…

uniapp数据缓存和发起网络请求

数据缓存 uni.onStorageSync同步的方式将数据存储到本地缓存 <template><button click"onStorageSync()">存储数据</button> </template><script setup>const onStorageSync () > {// 存储数据uni.setStorageSync(username, 张三)…