图像处理中的角点检测Python-OpenCV 中的实现

马丁·亚当斯 (Martin Adams)在Unsplash上拍摄的照片

一、说明

        在图像处理的背景下,“特征”可以直观地理解为图像中易于识别并用于表示图像的独特或独特的部分。将特征视为图像中使其可区分的“地标”或“焦点”。为了使这一点更具关联性,请考虑一下您如何识别现实生活中熟悉的地方或物体。

照片由Cory Schadt在Unsplash上拍摄

        想象一下您正在看一张繁忙的城市街道的照片。什么首先引起您的注意?它可能是一座形状独特的建筑,一个色彩缤纷的广告牌,或者一个独特的街道标志。这些元素之所以引人注目,是因为它们在某种程度上与周围环境不同——也许是通过形状、颜色或纹理。在图像处理中,这些类似于特征。

功能是许多高级图像处理任务的构建块。它们就像算法用来“理解”并以有意义的方式处理图像的线索或关键点。

二、特征类型

  • 边缘是图像中强度或颜色的显着过渡。想象一下天空映衬下一座山的轮廓;山与天交界处形成边缘。

边缘。来源

  • 是两条或多条边相交的点。它们就像相框的角,两条边相交于一点。

角落。来源

  • 斑点是图像中与周围区域相比具有不同属性(例如亮度或颜色)的区域。将它们视为表面上的斑点或瑕疵。它们用于需要识别或计算对象的场景,例如计算图像中苹果的数量。

斑点。来源

  • 山脊是图像强度在多个方向上增加的线条,例如波浪的波峰或山脊。

山脊。来源

三、特征检测

        图像处理中的特征检测算法就像侦探在复杂场景中寻找重要线索的工具。这些算法旨在自动检测和识别图像的关键特征,例如边缘、角点和特定图案,这些特征对于理解和分析图像至关重要。

        角点可以被认为是两条边缘的交点,或者图像中梯度方向显着改变的点。它代表多个方向上局部强度变化较大的点。

  • 哈里斯角点检测
  • Shi-Tomasi角点检测

3.1 哈里斯角点检测

Harris 角点检测器是图像处理角点检测的基本算法。它可以识别图像中各个方向上强度发生显着变化的点。

        Harris 角点检测器背后的核心思想是识别图像中当您向任何方向移动时强度发生显着变化的区域。它基于这样的观察:在平坦区域(如晴朗的天空),强度保持相当恒定,而沿着边缘,强度在一个方向上发生巨大变化,但在垂直方向上变化不大。然而,在拐角处,各个方向的强度都会发生变化。

该算法使用一种数学方法,涉及计算图像中每个像素的矩阵(通常称为哈里斯矩阵)。该矩阵捕获该像素周围所有方向的梯度变化(即强度变化)。

它映射 X 和 Y 中采用的所有梯度。

来源

然后将椭圆拟合到分布中。

来源

该算法根据 lambda 值计算响应值。

来源

这是演示 Harris 角点检测器的基本脚本。

import cv2
import numpy as npimage = cv2.imread('image.jpeg')
if image is None:print("Error loading image")exit()# Convert to grayscale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# Convert to float32 for more precision
gray = np.float32(gray)# Apply Harris Corner Detector
corners = cv2.cornerHarris(gray, blockSize=2, ksize=3, k=0.04)# Dilate corner image to enhance corner points
corners = cv2.dilate(corners, None)# Threshold to mark the corners on the image
threshold = 0.01 * corners.max()
image[corners > threshold] = [0, 0, 255]# Display the result
cv2.imshow('Harris Corners', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.cornerHarris函数是 OpenCV 中用于图像角点检测的关键函数,基于 Harris 角点检测算法。该函数分析图像中强度的局部变化以识别角点。

  • src是输入图像。它必须是 类型的灰度图像float32
  • blockSize是考虑用于角点检测的邻域的大小。它指定将计算强度局部方差的窗口(即局部区域)的大小。
  • ksize是 Sobel 算子的孔径参数。Sobel 算子用于计算 Harris 角点检测算法中的图像梯度(x 和 y 导数)。ksize是用于 Sobel 算子的内核的大小。常见值为 3、5 或 7。较大的内核大小有助于平滑梯度,但可能会降低检测尖角点的准确性。
  • k是算法中使用的方程中的 Harris 检测器自由参数。它用于计算响应分数,确定某个区域是否被视为角点。的值k通常很小,通常在 0.04 到 0.06 的范围内。确切的值可以根据应用的具体要求进行调整。非常高的值可能会导致检测到更少的角点,而非常低的值可能会使检测器对噪声过于敏感。

哈里斯角点检测。图片由作者提供。

哈里斯角点检测器擅长区分边缘和角点。它不会错误地将边缘识别为角点。即使图像旋转,它仍然有效,因为角结构不会随着旋转而改变。虽然它不是完全尺度不变的,但在尺度的轻微变化和不同的照明条件下它的表现相当好。

检测器可能难以应对主要的尺度变化(例如,以不同尺寸出现的同一角),并且其本质上并不是为了处理照明或视角的显着变化而设计的。

它可用于特征提取、图像匹配、运动跟踪和 3D 建模等各种应用。

3.2 Shi-Tomasi角点检测

Shi-Tomasi 方法,也称为“良好特征跟踪检测器”,基于与 Harris 角点检测器相同的基本原理。然而,它引入了一种不同的方法来评估角点响应。

主要区别在于所使用的角响应函数。Harris 使用基于梯度协方差矩阵的两个特征值的组合得分,而 Shi-Tomasi 方法通过仅考虑两个特征值中较小的一个来简化此过程。

Shi-Tomasi 方法特别擅长检测更清晰且定义明确的角点。与 Harris 方法相比,它不太容易检测到平坦区域或沿边缘的假角。

import cv2
import numpy as npimage = cv2.imread('07.jpg')
if image is None:print("Error loading image")exit()# Convert to grayscale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# Shi-Tomasi corner detection parameters
maxCorners = 100
qualityLevel = 0.01
minDistance = 10corners = cv2.goodFeaturesToTrack(gray, maxCorners, qualityLevel, minDistance)# Draw corners on the image
if corners is not None:corners = np.int0(corners)  for i in corners:x, y = i.ravel()cv2.circle(image, (x, y), 3, (0, 255, 0), -1)  # Display the result
cv2.imshow('Shi-Tomasi Corners', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

什托马西角。图片由作者提供。

Shi-Tomasi 角点检测需要灰度图像。cv2.cvtColor将图像从一种颜色空间转换为另一种颜色空间。

cv2.goodFeaturesToTrack是实现Shi-Tomasi角点检测算法的函数。

void cv::goodFeaturesToTrack ( InputArray  image,
OutputArray  corners,
int  maxCorners,
double  qualityLevel,
double  minDistance,
InputArray  mask = noArray(),
int  blockSize = 3,
bool  useHarrisDetector = false,
double  k = 0.04 
) 
  • image是要执行角点检测的源图像。
  • maxCorners指定要返回的最大角数。如果将其设置为负数,它将返回所有检测到的角点。
  • qualityLevel表征要考虑的拐角的最低质量。它是一种相对度量,基于图像中角点的最高质量得分。分数是根据 Shi-Tomasi 方法中的特征值或 Harris 中的响应函数确定的。
  • minDistance指定返回角点之间的最小欧氏距离。
  • mask是一个可选的二进制掩码,指定在哪里寻找角点。
  • blockSize是考虑用于角点检测的邻域的大小。

四、结论

 以上我们了解到Harris和Shit焦点检测方法,关于tezheng

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

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

相关文章

EM32DX-C4【C#】站15

1外观: J301 直流 24V 电源输入 CAN0 CAN0 总线接口 CAN1 CAN1 总线接口 J201 IO 接线段子 S301-1、S301-2 输出口初始电平拨码设置 S301-3~S301-6 模块 CAN ID 站号拨码开关 S301-7 模块波特率拨码设置 S301-8 终端电阻选择开关 2DI: 公共端是…

stm32项目(11)——基于stm32的俄罗斯方块游戏机

1.功能设计 使用stm32f103zet6平台,以及一块LCD屏幕,实现了一个俄罗斯方块游戏机。可以用按键调整方块的位置、还可以控制方块下降的速度! 2.视频演示 俄罗斯方块 3.俄罗斯方块发展史 俄罗斯方块是一种经典的拼图游戏,由苏联俄罗…

分类预测 | Matlab实现OOA-CNN-SVM鱼鹰算法优化卷积支持向量机分类预测

分类预测 | Matlab实现OOA-CNN-SVM鱼鹰算法优化卷积支持向量机分类预测 目录 分类预测 | Matlab实现OOA-CNN-SVM鱼鹰算法优化卷积支持向量机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现OOA-CNN-SVM鱼鹰算法优化卷积支持向量机分类预测&#xff0…

设备制造行业CRM:提升客户满意度,驱动业务增长

设备制造行业客户需求多样化、服务链路长,企业在关注APS、EMS等工业软件之余还要以客户为中心,做好客户服务。设备制造行业CRM管理系统是企业管理客户关系的利器,设备制造行业CRM的作用有哪些?一文带您看懂。 设备制造行业需要解…

【LeetCode热题100】【双指针】接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] …

不同角度范围下四元数转欧拉角的方式

前言 在标定过程中求出的欧拉角与预设真值差距太大,检查中发现求出的角度与真值角度都可以将车辆坐标系变换到相机坐标系。后通过查阅文献,发现四元数对应的欧拉角并不唯一,在不同的条件下可求出不同的欧拉角,实际应用中需根据实…

【LeetCode】2629. 复合函数

复合函数 题目题解 题目 请你编写一个函数,它接收一个函数数组 [f1, f2, f3,…, fn] ,并返回一个新的函数 fn ,它是函数数组的 复合函数 。 [f(x), g(x), h(x)] 的 复合函数 为 fn(x) f(g(h(x…

提高软件代码质量的方法

提高软件代码质量是确保软件可维护性、稳定性和可扩展性的关键步骤。以下是一些建议,有助于提高软件代码质量,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.遵循编码规范: …

LangChain学习指南(二)——Retrieval

在上一章中,已经介绍了Langchain最最核心的module——model IO之后,本章继续介绍另一重要的模块Retrieval。 Retrieval这一模块在开发应用时也是至关重要的一部分,直接汉译过来即”检索“。该功能经常被应用于构建一个“私人的知识库”&…

网络程序设计

互相连接,发送信息 tcp和udp协议 tcp会有准备,udp不会准备。 8080端口:tomcat端口,java和web相连接 80端口:http 21端口:ftp 套接字 socket:提供给程序可以对外进行连接的接口 ip地址 特…

基于c++版本链队列改-Python版本链队列基础理解

##基于链表的队列实现 可以将链表的“头节点”和“尾节点”分别视为“队首”和“队尾”,规定队尾仅可添加节点,队首仅可删除节点。 ##图解 ##基于链表的队列实现代码 class ListNode:"""定义链表"""def __init__(self)…

构建工具链

系列文章目录 文章目录 系列文章目录一、GNU工具链组成二、构建工具链的过程三、准备工作1、环境变量2、Binutils 四、编译freestanding的交叉编译器1、GCC 下载 本文基于《深度探索Linux操作系统:系统构建和原理解析》 一、GNU工具链组成 编译过程分为4个阶段&…

Python接口自动化测试:断言封装详解!

前言 在进行API接口测试时,断言起着至关重要的作用。断言是用于验证预期结果与实际结果是否一致的过程。在Python中,我们可以利用一些库来实现断言功能。 1. 安装必要的库 在Python中,我们主要会使用两个库:requests和jsonpath…

cocos creator [Window] Cannot read property ‘dump‘ of null

写脚本的时候,出现了如下的问题, [Window] Cannot read property dump of null 原因:在下图中,方式一是正常的,而方式二则会爆出此错误,所以需要初始化,给它赋值

python+paddleocr 进行图像识别、找到文字在屏幕中的位置

目录 前言 1、安装paddleocr 2、安装PIL 3、安装numpy 4、 安装pyautogui 5、进行文本识别 6、识别结果 7、获取文字在图片/屏幕中的位置 8、pyautoguipaddleocr鼠标操作 9、完整代码 前言 最近在做自动化测试,因为是处理过的界面,所以使用pyw…

在KeyarchOS上体验WildFly

一、浪潮信息KeyarchOS简单介绍 KeyarchOS具备稳定可靠、高效软硬协同、全天候运维、安全可信等特性,增强了对云计算、人工智能等场景的支持,性能稳定性领先,生态完善,符合金融、政务、能源、交通、通信、教育、医疗等关键行业的应用要求。具备非常广泛的应用。 官方地址&…

C#关于文件剖析

一、概述 文件,具有永久存储及特定顺序的字节组成的一个有序、具有名称的集合; 流,提供一种向后备存储写入字节和从后备存储读取字节的方式; 读写文件和目录时可使用简单的API,也可使用先进的API提供更多的功能&am…

4G工业路由器智慧楼宇门禁无人值守、实时监控

门禁是我们日常生活中常见的基础设施,就像是现代社会智慧城市中的“门神”,在楼宇管理领域中普遍采用的安防卫士。4G工业路由器的物联网应用则为楼宇门禁管理带来了更加便捷和高效的解决方案。 在传统的楼宇门禁系统中,人员需要手动刷卡、输…

记录 | vscode设置自动换行

右上菜单栏 -> 查看 -> 打开自动换行 或者还有种方式,如下, 左下角小齿轮,点击设置 然后输入 Editor: Word Wrap ,把开关打开为 on

超声波清洗机可以洗哪些东西、功能超全超声波清洗机推荐

超声波清洗机可以清洗的物品是比较多的,首先最经常看见的就是眼镜是交给超声波清洗机清洗的,说到这点,佩戴眼镜的朋友是一定要重视起眼镜清洗的!眼镜长时间不清洗的话镜片以及眼镜支架缝隙中会堆积非常多细菌以及灰尘。所以一定要…