图像处理中的角点检测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.俄罗斯方块发展史 俄罗斯方块是一种经典的拼图游戏,由苏联俄罗…

CoreDNS实战(二)-CoreDNS+ETCD实现DNS服务发现

1 引言 在前面的文章中讲了如何搭建一个内网的DNS服务,但是这里有个问题,mxsm-register.local表示局域网的注册中心域名,如果需要将每台部署了注册中心的IP地址写到CoreDNS的配置文件中。这样就需要每次都去修改 Corefile 配置文件。那有没有…

数据结构:链表应用:第6关:链表的分解

任务描述 本关任务:利用单链表A表示一个非零整数序列,把A分解为两个具有相同结构的链表B和C,其中B表的结点为A表中值小于零的结点,而C表的结点为A表中值大于零的结点。要求空间复杂度为O(1),链表B和C均利用链表A的结点…

Perl | Multi-line Strings | Here Document

原文链接:https://www.geeksforgeeks.org/perl-multi-line-strings-here-document/ Multi-line string using Here Document Here Document is an alternative way for multiple print statements. A Here-Document can also be used for multi-line string. It d…

WordPress定时发布文章失败的原因及解决办法

WordPress的定时发布功能可以使我们能够提前准备好文章,并在特定的日期和时间自动发布。这样,可以根据内容计划和读者喜好来安排发布时间,而不必手动操作,在不方便操作的情况下实现内容的即时更新发布,这个功能还是非常…

Orvibo另款网关ViCenter-300的分析之二,系统分析

Vicenter300的分析,请上接之一 Orvibo另款网关ViCenter-300的分析之一的链接地址: Orvibo另款网关ViCenter-300的分析之一-CSDN博客 简单地看了一下硬件的组成部分,从中我们可以看出,Openwrt系统是嵌入式系统入门级的系统,也是一个很容易转换为产品的系统之一。 很多智…

【C语言】【二级】将所指字符串中所有下标为奇数位置上的字母转换成大写

题目 请编写一个函数fun,它的功能是:将ss所指字符串中所有下标为奇数位置上的字母转换成大写(若该位置上不是字母,则不转换)。 例如,若输入" abc4EFG",则应输出"aBc4EFG"。 考点 考点:指针、ASCII码、 数组和循环语句。 解法&#x…

分类预测 | 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] …

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

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

java-快速入门篇

温馨提醒:概念固然重要,但通过概念下面的例子更容易理解并运用哦 文章目录 1. 基础语法1.1 变量与数据类型1.2 条件语句1.3 循环结构 2. 面向对象2.1 类与对象2.2 继承与多态 3. 集合框架3.1 列表(List)3.2集(Set&…

【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这一模块在开发应用时也是至关重要的一部分,直接汉译过来即”检索“。该功能经常被应用于构建一个“私人的知识库”&…

Linux服务器超级实用的脚本

1.使用INOTIFYRSYNC自动实时同步数据 代码执行: bash inotify_rsyncs.sh :cat inotify_rsyncs.sh 脚本内容如下: #!bing/bash # Author: reyn #检测/data路径下的文件变化,排除Temp目录 INOTIFY_CMD"inotifywait -mrq -e …

网络程序设计

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

用Java的Process执行命令行,ffmpeg抽帧到一千多帧图片卡住,不报错。

项目场景: 最近需要写一个抽帧、推流的工具类,抽帧写好测试的时候也没问题,等到真正用的时候就发现各种问题。 问题描述 用Java执行ffmpeg抽帧命令,测试的时候没有问题,后来发现抽帧图片多了就会卡住。 刚开始觉得可…

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

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