图像处理中的角点检测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.rhkb.cn/news/211832.html

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

相关文章

js基础之事件监听案例入门

事件绑定 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head&…

c语言五子棋

下面是一个简单的C语言五子棋实现示例&#xff1a; #include <stdio.h>#include <stdlib.h>#define BOARD_SIZE 15char board[BOARD_SIZE][BOARD_SIZE];void init_board() { int i, j; for (i 0; i < BOARD_SIZE; i) { for (j 0; j < BOARD_…

0X05

打开题目 点击完登录和注册都没有什么反应&#xff0c;所以先扫一下看看 在出现admin.php后就截止了&#xff0c;访问看看,进入后台。。 尝试一下弱口令 admin/12345 或者是demo/demo 设计中-自定义->右上角导出主题 找到一个导出的点&#xff0c;下载了一个1.zip压缩包…

智能优化算法应用:基于卷尾猴算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于卷尾猴算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于卷尾猴算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.卷尾猴算法4.实验参数设定5.算法结果6.参考文献7.…

zookeeper1==zookeeper源码阅读,源码启动ZK集群

下载源码 Tags apache/zookeeper GitHub https://codeload.github.com/apache/zookeeper/zip/refs/tags/release-3.9.1 JDK8 MAVEN3.8.6 mvn -DskipTeststrue package 配置ZK1 zkServer.cmd中指出了启动类是 QuorumPeerMain QuorumPeer翻译成集群成员比较合理&#xf…

【Spring】依赖注入之属性注入详解

前言&#xff1a; 我们在进行web开发时&#xff0c;基本上一个接口对应一个实现类&#xff0c;比如IOrderService接口对应一个OrderServiceImpl实现类&#xff0c;给OrderServiceImpl标注Service注解后&#xff0c;Spring在启动时就会将其注册成bean进行统一管理。在Co…

【计算机网络学习之路】URL概念及组成

目录 一. URL是什么 二. URL的组成 三. encode和decode 前言 本系列文章是计算机网络学习的笔记&#xff0c;欢迎大佬们阅读&#xff0c;纠错&#xff0c;分享相关知识。希望可以与你共同进步。 本篇讲解使用浏览器不可或缺的部分——URL 一. URL是什么 域名及DNS 我们在…

SQL Server 数据库,创建触发器避免数据被更改

5.4触发器 触发器是一种特殊类型的存储过程&#xff0c;当表中的数据发生更新时将自动调用&#xff0c;以响应INSERT、 UPDATE 或DELETE 语句。 5.4.1什么是触发器 1.触发器的概念 触发器是在对表进行插入、更新或删除操作时自动执行的存储过程&#xff0c;触发器通常用于强…

nvm for windows使用与node/npm/yarn的配置

1 下载 nvm for windows download – github 下拉到Assets, 下载.exe文件 2 安装 安装到如下文件夹中 目录可以自己选, 可以换别的名字, 自己记住即可 新手建议全部看完再进行个人配置, 或者使用与博主一致的路径 D:\DevelopEnvironment\nvm3 配置nvm使用的镜像 node_mir…

sed 流式编辑器

使用方式&#xff1a; 1&#xff0c;前置指令 | sed 选项 定址符指令 2&#xff0c;sed 选项 定址符指令 被处理文档 选项&#xff1a; -n 屏蔽默认输出 -i写入文件 -r支持扩展正则 指令&#xff1a; p输出 d删除 s替换 sed -n 1p user //输出第1行 sed -n…

2023五岳杯量子计算挑战赛数学建模思路+模型+代码+论文

赛题思路&#xff1a;12月6日晚开赛后第一时间更新&#xff0c;获取见文末名片 “五岳杯”量子计算挑战赛&#xff0c;是国内专业的量子计算大赛&#xff0c;也是玻色量子首次联合移动云、南方科技大学共同发起的一场“企校联名”的国际竞赛&#xff0c;旨在深度融合“量子计算…

点评项目——短信登陆模块

2023.12.6 短信登陆如果基于session来实现&#xff0c;会存在session共享问题&#xff1a;多台Tomcat不能共享session存储空间&#xff0c;这会导致当请求切换到不同服务器时出现数据丢失的问题。 早期的解决办法是让session提供一个数据拷贝的功能&#xff0c;即让各个Tomcat的…

11.机器人系统仿真搭建gazebo环境、仿真深度相机、雷达、RGB相机

目录 1 gazebo仿真环境搭建 1.1 直接添加内置组件创建仿真环境 1.2 urdf、gazebo、rviz的综合应用 2 ROS_control 2.1 运动控制实现流程(Gazebo) 2.1.1 已经创建完毕的机器人模型&#xff0c;编写一个单独的 xacro 文件&#xff0c;为机器人模型添加传动装置以及控制器 …

【openssl】Window系统如何编译openssl

本文主要记录如何编译出windows版本的openss的lib库 如果需要获取RSA公钥私钥&#xff0c;推荐【openssl】 生成公钥私钥 |通过私钥获取公钥-CSDN博客 目录 1.下载openssl&#xff0c;获得openssl-master.zip。 2.下载Perl 3.下载NASM 4.配置perl和NASM的环境变量 5.进入…

应用程序无法找到xinput1_3.dll怎么办,xinput1_3.dll 丢失的解决方法

当电脑系统或特定应用程序无法找到或访问到 xinput1_3.dll 文件时&#xff0c;便会导致错误消息的出现&#xff0c;例如“找不到 xinput1_3.dll”、“xinput1_3.dll 丢失”等。这篇文章将大家讨论关于 xinput1_3.dll 文件的内容、xinput1_3.dll丢失问题的解决方法&#xff0c;以…

限流算法,基于go的gRPC 实现的

目录 一、单机限流 1、令牌桶算法 3、固定窗口限流算法 4、滑动窗口 二、集群限流 1、分布式固定窗口 &#xff08;基于redis&#xff09; 2、分布式滑动窗口 一、单机限流 1、令牌桶算法 令牌桶算法是当流量进入系统前需要获取令牌&#xff0c;没有令牌那么就要进行限…

Python之html2text,清晰解读HTML内容!

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是彭涛&#xff0c;今天为大家分享 Python之html2text&#xff0c;清晰解读HTML内容&#xff0c;全文3900字&#xff0c;阅读大约10分钟。 HTML是Web开发中常见的标记语言&#xff0c;但有时我们需要将HTML内容…

关于 mapboxgl 的常用方法及效果

给地图标记点 实现效果 /*** 在地图上添加标记点* point: [lng, lat]* color: #83f7a0*/addMarkerOnMap(point, color #83f7a0) {const marker new mapboxgl.Marker({draggable: false,color: color,}).setLngLat(point).addTo(this.map);this.markersList.push(marker);},…

Ubuntu-rsyslog和systemd-journald日志服务

rsyslog日志服务 rsyslog作为传统的系统日志服务&#xff0c;把所有收集到的日志都记录到/var/log/目录下的各个日志文件中。 常见的日志文件如下&#xff1a; /var/log/messages 绝大多数的系统日志都记录到该文件 /var/log/secure 所有跟安全和认证授权等日志…

玩转Sass:掌握数据类型!

当我们在进行前端开发的时候&#xff0c;有时候需要使用一些不同的数据类型来处理样式&#xff0c;Sass 提供的这些数据类型可以帮助我们更高效地进行样式开发&#xff0c;本篇文章将为您详细介绍 Sass 中的数据类型。 布尔类型 在 Sass 中&#xff0c;布尔数据类型可以表示逻…