《数字图像处理-OpenCV/Python》第17章:图像的特征描述

《数字图像处理-OpenCV/Python》第17章:图像的特征描述


本书京东 优惠购书链接 https://item.jd.com/14098452.html
本书CSDN 独家连载专栏 https://blog.csdn.net/youcans/category_12418787.html

在这里插入图片描述


第17章:图像的特征描述


特征检测与匹配是计算机视觉的基本任务,包括检测、描述和匹配三个相互关联的步骤。广泛应用于目标检测、图像检索、视频跟踪和三维重建等诸多领域。
OpenCV提供了丰富的特征检测和匹配算法,不仅继承了cv::Feature2D 类,而且采用了统一的定义和封装。


17.1 角点检测之Harris算法

角是直线方向的快速变化,角点定义为两条边的交点,是简单高效的特征。角点检测(Corner Detection)是特征检测的基础,Harris算法是经典的角点检测算法。


Harris角点检测

Harris角点检测算法的原理是,通过检测窗口在图像上移动,计算移动前后窗口中像素的灰度变化。角点是两条边的交点,其特征是检测窗口沿任方向移动都会导致灰度的显著变化。

Harris算法计算梯度的协方差矩阵M,协方差矩阵形状为椭圆,长短半轴由特征值 ( λ 1 , λ 2 ) (λ_1, λ_2) (λ1,λ2)决定,方向由特征向量决定。定义如下的角点响应函数 R。

R = d e t ( M ) − k [ t r a c e ( M ) ] 2 d e t ( M ) = λ 1 ∗ λ 2 t r a c e ( M ) = λ 1 + λ 2 \begin{aligned}R =& det(M) - k [trace(M)]^2 \\&det(M) = \lambda _1 * \lambda _2 \\&trace(M) = \lambda _1 + \lambda _2\end{aligned} R=det(M)k[trace(M)]2det(M)=λ1λ2trace(M)=λ1+λ2

角点响应 R 只与矩阵 M 的特征值 λ 1 , λ 2 \lambda _1,\lambda _2 λ1λ2 有关,可以用来判断区域是拐角、边缘还是平坦:

  • λ 1 , λ 2 \lambda _1,\lambda _2 λ1λ2 较小时, ∣ R ∣ |R| R 较小,即各个方向上灰度基本不变,表明检测器处于平坦区域;
  • λ 1 > > λ 2 \lambda _1 >> \lambda _2 λ1>>λ2 λ 2 > > λ 1 \lambda _2 >> \lambda _1 λ2>>λ1 时, R < 0 R <0 R<0 ,即灰度在某个方向变化,但在其正交方向不变化,表明检测器处于边缘区域;
  • λ 1 , λ 2 \lambda _1,\lambda _2 λ1λ2 较大且数值相当时,灰度在某个方向及其正交方向都变化强烈,表明存在角点或孤立点。

Harris角点检测算法的重复性好、检测效率高,应用比较广泛。

Shi-Tomas角点检测

Shi-Tomas算法是对Harris角点检测算法的改进,区别在于将角点响应函数修改如下。

R = m i n ( λ 1 , λ 2 ) R = min(\lambda _1 , \lambda _2) R=min(λ1,λ2)
只有当梯度协方差矩阵M的特征值 λ 1 , λ 2 λ_1, λ_2 λ1,λ2 都大于阈值时,才判定为角点。


OpenCV的角点检测函数

在OpenCV中提供了函数cv.cornerEigenValsAndVecs计算图像或矩阵的特征值和特征向量,函数cv.cornerMinEigenVal计算梯度矩阵的最小特征值,函数cv.cornerHarris实现Harris角点检测。

函数原型

cv.cornerHarris(src, blockSize, ksize, k[, dst, borderType]) → dst
cv.cornerEigenValsAndVecs(src, blockSize, ksize[, dst, borderType]) → dst
cv.cornerMinEigenVal(src, blockSize[, dst, ksize, borderType]) → dst

参数说明

 src:输入图像,单通道,数据类型为CV_8U或浮点数类型。
 dst:输出图像,角点响应函数,大小与src相同,格式为CV_32FC1。
 blockSize:检测器的滑动窗口尺寸,为整数。
 ksize:Sobel梯度算子的孔径,即卷积核的大小,为整数。
 k:Harris角点响应函数的调节参数,通常取0.04~0.06。
 borderType:边界扩充的类型,不支持BORDER_WRAP。

注意问题
⑴ 函数cv.cornerHarris返回值是如下的Harris的角点响应图像R。
R = d s t ( x , y ) = d e t ( M ( x , y ) ) − k ∗ [ t r a c e ( M ( x , y ) ) ] 2 R=dst(x,y)=det(M(x,y))-k*[trace(M(x,y))]^2 R=dst(x,y)=det(M(x,y))k[trace(M(x,y))]2
从角点响应图像中筛选大于检测阈值、且为局部最大值的点,就是图像的角点。检测阈值通常可以设为最大响应值的0.01~0.1。
⑵ 函数cv.cornerMinEigenVal与cv.cornerEigenValsAndVecs类似,区别在于它计算和保存矩阵M的最小特征值,即 m i n ( λ 1 , λ 2 ) min(λ_1 ,λ_2) min(λ1,λ2)


在OpenCV中提供了函数cv.goodFeaturesToTrack实现Shi-Tomas角点检测。

先使用cornerHarris或cornerMinEigenVal计算角点响应函数,最小特征值小于阈值的角点被剔除;并进行非最大值抑制,只保留(3×3)邻域中的局部最大值;最后按照角点响应函数的大小排序,输出前N个结果。

函数原型

cv.goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance[, corners, mask, blockSize, useHarrisDetector, k=0.04]) → corners

参数说明

 src:输入图像,单通道,数据类型为CV_8U或浮点数类型。
 corners:二维点向量集合的坐标(x,y),形如(n,1,2)的Numpy数组,浮点数。
 maxCorners:角点数量的最大值N,整数。
 qualityLevel:角点阈值系数,浮点数,取值范围0.0~1.0。
 minDistance:角点之间的最小欧式距离。
 mask:掩模图像,指定检测角点的区域,可选项。
 blockSize:检测器的滑动窗口尺寸,可选项,默认值为3。
 k:Harris角点响应函数的调节参数,可选项,默认值0.04。
 useHarrisDetector:计算角点响应的方法,默认值false,使用cornerMinEigenVal计算,true表示使用cornerHarris计算。

注意问题

⑴ 输出参数corners是形如(n,1,2)的Numpy数组,表示检测到n个角点的坐标(x,y)。
⑵ 检测阈值是阈值系数qualityLevel与最大响应值的乘积,小于阈值的角点都被拒绝。例如,最大响应为1500,系数为0.1,则检测阈值为150。
⑶ 剔除间距小于maxDistance的角点,实现非最大值抑制方法,避免重复的邻近角点。


【例程1701】角点检测之Harris算法和Shi-Tomas算法

本例程示例Harris角点检测算法和Shi-Tomas角点检测算法的使用。
Harris角点检测函数的返回值是角点响应图像,需要进行阈值处理才能得到角点坐标。Shi-Tomas角点检测函数的返回值是角点坐标。


# 【1701】角点检测之Harris算法和Shi-Tomas算法
import cv2 as cv
import numpy as np
from matplotlib import pyplot as pltif __name__ == '__main__':img = cv.imread("../images/Fig1201.png", flags=1)gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)# Harris 角点检测算法dst = cv.cornerHarris(gray, 5, 3, k=0.04)  # 角点响应图像,坐标(y,x)# Harris[dst>0.1*dst.max()] = [0,0,255]  # 筛选角点,红色标记stack = np.column_stack(np.where(dst>0.2*dst.max()))  # 阈值筛选角点 (n,2)corners = stack[:, [1, 0]]  # 调整坐标次序:(y,x) -> (x,y)print("num of corners by Harris: ", corners.shape)imgHarris = img.copy()for point in corners: cv.drawMarker(imgHarris, point, (0,0,255), cv.MARKER_CROSS, 10, 1)  # 在点(x,y)标记# Shi-Tomas 角点检测算法maxCorners, qualityLevel, minDistance = 100, 0.1, 5corners = cv.goodFeaturesToTrack(gray, maxCorners, qualityLevel, minDistance)  # 角点坐标 (x,y)corners = np.squeeze(corners).astype(np.int)  # 检测到的角点 (n,1,2)->(n,2)print("num of corners by Shi-Tomas: ", corners.shape[0])imgShiTomas = np.copy(img)for point in corners:  # 注意坐标次序cv.drawMarker(imgShiTomas, (point[0], point[1]), (0,0,255), cv.MARKER_CROSS, 10, 2)  # 在点(x,y)标记plt.figure(figsize=(9, 3.3))plt.subplot(131), plt.title("1. Original")plt.axis('off'), plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))plt.subplot(132), plt.title("2. Harris corners")plt.axis('off'), plt.imshow(cv.cvtColor(imgHarris, cv.COLOR_BGR2RGB))plt.subplot(133), plt.title("3. Shi-tomas corners")plt.axis('off'), plt.imshow(cv.cvtColor(imgShiTomas, cv.COLOR_BGR2RGB))plt.tight_layout()plt.show()  

运行结果:
num of corners by Harris: 589
num of corners by Shi-Tomas: 66

在这里插入图片描述

图17-1 Harris角点检测和Shi-Tomas角点检测


程序说明:

⑴ 程序运行结果如图17-1所示。子图1是原始图像,子图2是Harris角点检测的结果,子图3是Shi-Tomas角点检测的结果。
⑵ 运行结果表明,Harris算法函数检测到的角点数量远大于Shi-Tomas算法函数的结果。这是由于角点周围像素的响应值都很高,都被识别为角点,因此Harris函数会检测到大量重复的角点。


版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/140212758)
Copyright 2024 youcans, XUPT
Crated:2024-07-05

《数字图像处理-OpenCV/Python》 独家连载专栏 : https://blog.csdn.net/youcans/category_12418787.html

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

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

相关文章

javascript v8编译器的使用记录

我的机器是MacOS Mx系列。 一、v8源码下载构建 1.1 下载并更新depot_tools git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git export PATH/path/to/depot_tools:$PATH 失败的话可能是网络问题&#xff0c;可以试一下是否能ping通&#xff0c;连…

【代码随想录_Day25】452. 用最少数量的箭引爆气球 435. 无重叠区间 763. 划分字母区间

Day25 OK&#xff0c;今日份的打卡&#xff01;第二十五天 以下是今日份的总结用最少数量的箭引爆气球无重叠区间划分字母区间 以下是今日份的总结 用最少数量的箭引爆气球无重叠区间划分字母区间 今天的题目难度不低&#xff0c;而且非常的有意思&#xff0c;尽量还是写一些…

imx6ull/linux应用编程学习(11)CAN应用编程基础

关于裸机的can通信&#xff0c;会在其他文章发&#xff0c;这里主要讲讲linux上的can通信。 与I2C,SPI等同步通讯方式不同&#xff0c;CAN通讯是异步通讯&#xff0c;也就是没有时钟信号线来保持信号接收同步&#xff0c;也就是所说的半双工&#xff0c;无法同时发送与接收&…

python项目常见使用的传参调试方法

简介 你是否经常遇到下载的github开源知名项目&#xff0c;不知如何调试&#xff1f;只知道按说明的命令行运行&#xff1f;遇到异常或想改造也无从下手&#xff1f;这篇文档章将指导你如何入手调试别人的大型开源项目。 常见项目使用说明及代码如何调试 常见情况一 使用说…

16.【C语言】初识常见关键字 上

1.关键字由C语言自带&#xff0c;不能自创 2.关键字不作变量名 3.关键字举例&#xff1a; auto自动&#xff1a;每个局部变量都由auto修饰&#xff0c;含义&#xff1a;自动创建&#xff0c;自动销毁 auto int a0;等价于int a0; exturn:申明外部符号 register:寄存器关键字…

数据治理的制胜法宝:筛斗数据技术在现代企业管理中的应用

数据治理的制胜法宝&#xff1a;筛斗数据技术在现代企业管理中的应用 在当今这个数据驱动的时代&#xff0c;企业管理的效率和竞争力越来越依赖于对数据的精准把握和高效利用。然而&#xff0c;随着企业规模的扩大和业务复杂度的增加&#xff0c;数据治理成为了一个亟需解决的…

EasyExcel 单元格根据图片数量动态设置宽度

在使用 EasyExcel 导出 Excel 时&#xff0c;如果某个单元格是图片内容&#xff0c;且存在多张图片&#xff0c;此时就需要单元格根据图片数量动态设置宽度。 经过自己的研究和实验&#xff0c;导出效果如下&#xff1a; 具体代码如下&#xff1a; EasyExcel 版本 <depen…

Haxm安装失败的解决办法

确认你的处理器是否是Intel的&#xff0c;如果是AMD那就无法安装&#xff0c;如果是Intel的&#xff0c;再确认是否支持V1T 如果处理器是Intel的且支持VT&#xff0c;在开机时进入BIOS界面&#xff0c;不同的品牌进入BIOS的方法各不相同&#xff0c;通常是F2/F12/delete些&…

Python爬虫零基础实战,简洁实用!

1.爬虫简介 简单来讲&#xff0c;爬虫就是一个探测机器&#xff0c;它的基本操作就是模拟人的行为去各个网站溜达&#xff0c;点点按钮&#xff0c;查查数据&#xff0c;或者把看到的信息背回来。就像一只虫子在一幢楼里不知疲倦地爬来爬去。 你可以简单地想象&#xff1a;每个…

论文学习 --- RL Maximumdiffusion reinforcement learning

前言 个人拙见,如果我的理解有问题欢迎讨论 (●′ω`●) 文章出处:https://techxplore.com/news/2024-05-random-robots-reliable-ai-algorithm.html 研究背景 最大扩散强化学习(MaxDiff RL)是一种创新的强化学习方法,借鉴了统计力学中的扩散过程和最大熵原理。该方法在…

Hadoop的namenode启动不起来

1、 排查原因 Initialization failed for Block pool (Datanode Uuid a5d441af-d074-4758-a3ff-e1563b709267) service to node1/192.168.88.101:8020. Exiting. java.io.IOException: Incompatible clusterIDs in /data/dn: namenode clusterID CID-674c5515-3fe1-4a9c-881d…

AIGC技术加持,英智法律智能体来了!

法律行业作为一个由大量文件积累的领域&#xff0c;非常适合由数据驱动的AI智能体。人工智能在法律领域的应用已经成为不可逆转的趋势。根据最高人民法院发布的《关于规范和加强人工智能司法应用的意见》&#xff0c;国家鼓励在司法领域广泛应用人工智能技术&#xff0c;以提高…

四端口千兆以太网交换机与 SFP 扩展功能

在数字化时代&#xff0c;网络基础设施的重要性日益凸显&#xff0c;它是企业和个人取得成功的关键支撑。配备 SFP 插槽的 4 端口千兆以太网交换机提供了一种灵活且可扩展的网络解决方案&#xff0c;能够应对快速的数据传输、低延迟以及不断增长的带宽需求。本篇文章深入探讨了…

IP地址配置

1.为虚拟机配置IP地址&#xff0c;网关&#xff0c;DNS 例如&#xff1a;手动给虚拟机配置IP地址为 192.168.5.50/24&#xff1b;网关地址为&#xff1a;192.168.5.2&#xff1b;DNS地址为&#xff1a;192.168.5.2 解题步骤如下&#xff1a; #配置IP地址 [rootlocalhost ~]#…

大厂都在加急招人的大模型LLM,到底怎么学?

大模型如何入坑&#xff1f; 想要完全了解大模型&#xff0c;你首先要了解市面上的LLM大模型现状&#xff0c;学习Python语言、Prompt提示工程&#xff0c;然后深入理解Function Calling、RAG、LangChain 、Agents等 很多人不知道想要自学大模型&#xff0c;要按什么路线学&a…

【网络安全】第4讲 身份认证技术(笔记)

一、身份认证技术概述 1、身份认证 是网络安全的第一道防线。是最基本的安全服务&#xff0c;其他的安全服务都依赖于它。在物联网应用系统中&#xff0c;身份认证也是整个物联网应用层信息安全体系的基础。 2、基本身份认证技术 &#xff08;1&#xff09;双方认证 是一种双…

人员定位系统在监狱中的应用也同样重要!

监狱管理应用人员定位系统怎么样&#xff1f;新锐科创告诉你&#xff0c;人员定位系统在监狱中的应用也是很重要的&#xff0c;运用这种新型的定位系统&#xff0c;来起到管理监狱人员的作用。 人员定位系统 在监狱中&#xff0c;关押着大量的犯人&#xff0c;所以&#xff0c…

拓扑Transformer模型TopoFormer:革新药物研发的智能钥匙

在药物研发的浩瀚征途中&#xff0c;每一步都充满了挑战与未知。从发现潜在的治疗靶点&#xff0c;到筛选出有效的药物分子&#xff0c;再到通过临床试验验证其安全性和有效性&#xff0c;这一过程往往耗时漫长且成本高昂。然而&#xff0c;随着人工智能技术的飞速发展&#xf…

昇思25天学习打卡营第15天|ResNet50图像分类

学AI还能赢奖品&#xff1f;每天30分钟&#xff0c;25天打通AI任督二脉 (qq.com) ResNet50图像分类 图像分类是最基础的计算机视觉应用&#xff0c;属于有监督学习类别&#xff0c;如给定一张图像(猫、狗、飞机、汽车等等)&#xff0c;判断图像所属的类别。本章将介绍使用ResN…

【JAVA入门】Day13 - 代码块

【JAVA入门】Day13 - 代码块 文章目录 【JAVA入门】Day13 - 代码块一、局部代码块二、构造代码块三、静态代码块 在 Java 中&#xff0c;两个大括号 { } 中间的部分叫一个代码块&#xff0c;代码块又分为&#xff1a;局部代码块、构造代码块、静态代码块三种。 一、局部代码块…