当前位置: 首页 > news >正文

《数字图像处理-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

相关文章:

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

《数字图像处理-OpenCV/Python》第17章&#xff1a;图像的特征描述 本书京东 优惠购书链接 https://item.jd.com/14098452.html 本书CSDN 独家连载专栏 https://blog.csdn.net/youcans/category_12418787.html 第17章&#xff1a;图像的特征描述 特征检测与匹配是计算机视觉的…...

考研数学什么时候开始强化?如何保证进度不掉队?

晚了。我是实在人&#xff0c;不给你胡乱吹&#xff0c;虽然晚了&#xff0c;但相信我&#xff0c;还有的救。 实话实说&#xff0c;从七月中旬考研数一复习完真的有点悬&#xff0c;需要超级高效快速... 数二的时间也有点紧张... 中间基本没有试错的时间&#xff0c;让你换…...

Node.js的下载、安装和配置

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

java.util.Properties类介绍

java.util.Properties 是 Java 编程语言中的一个类,用于管理应用程序的配置信息,它继承自 java.util.Hashtable 类,因此它也是基于键值对的数据结构。主要用途是存储应用程序的配置参数,比如数据库连接信息、用户设置等。 以下是 Properties 类的一些主要特点和用法: 存储…...

SpringBoot后端验证码-防止密码爆破功能

一、简介 为了防止网站的用户被通过密码典爆破。引入验证码的功能是十分有必要的。而前端的验证码又仅仅是只防君子不防小人。通过burpsuit等工具很容易就会被绕过。所以后端实现的验证码才是对用户信息安全的一大重要保障。 实现思路&#xff1a; 1.引入图形生成的依赖 2.生成…...

ChatEval:通过多代理辩论提升LLM文本评估质量

论文地址:ChatEval: Towards Better LLM-based Evaluators through Multi-Agent Debate | OpenReviewText evaluation has historically posed significant challenges, often demanding substantial labor and time cost. With the emergence of large language models (LLMs…...

关于美国服务器IP的几个常见问题

在租用美国服务器时&#xff0c;与之密切相关的一个要素就是IP&#xff0c;关于IP的问题总是有人问起&#xff0c;这里列举几项常见的问题&#xff0c;以供参考。 一、IP收费吗&#xff1f; 一般情况下&#xff0c;在租用服务器时&#xff0c;会赠送几个IP&#xff0c;因为这些…...

redis运维:sentinel模式如何查看所有从节点

1. 连接到sentinel redis-cli -h sentinel_host -p sentinel_port如&#xff1a; redis-cli -h {域名} -p 200182. 发现Redis主服务器 连接到哨兵后&#xff0c;我们可以使用SENTINEL get-master-addr-by-name命令来获取当前的Redis主服务器的地址。 SENTINEL get-master-a…...

价格疑云?格行WiFi创始人亲解谜团,性价比之王如何炼成?

随身wifi行业乱象频出&#xff0c;作为行业领跑品牌的格行随身wifi&#xff0c;关于价格问题一直备受质疑。关于设备上的“格行自有格行的骄傲”也被外界认定为是自大&#xff0c;甚至发展的线下一万多家门店也被同行不认可。近日&#xff0c;企业财经专访记者有幸采访了格行随…...

揭秘“消费即赚”的循环购模式

大家好&#xff0c;我是吴军&#xff0c;今天我将带您深入探索一种颠覆传统的新型商业模式——循环购模式。在这个模式中&#xff0c;消费者不仅能享受到购物的乐趣&#xff0c;还能通过消费获得实实在在的回报&#xff0c;甚至实现“边消费边赚钱”的奇妙体验。您是否好奇&…...

javaweb个人主页设计(html+css+js)

目录 1 前言和要求 1.1 前言 1.2 设计要求 2 预览 2.1 主页页面 2.2 个人简介 2.3 个人爱好 2.4 个人成绩有代码&#xff0c;但是图片已省略&#xff0c;可以根据自己情况添加 2.5 收藏夹 3 代码实现 3.1 主页 3.2 个人简介 3.3 个人爱好 3.4 个人成绩&#xff…...

Android常用设计模式(小白必看)

不要担心冗长&#xff0c;3分钟解决面试和学习问题&#xff0c;收藏再看 目的&#xff1a;当作一种模板&#xff0c;结合自身特点&#xff0c;针对项目需求来使用 目录 单例模式 特点&#xff1a; 实现方式&#xff1a; 1、饿汉式 2、线程安全的懒汉式 3、双重校验锁 使…...

swift获取app网络和本地网络权限

请求蓝牙权限&#xff1a; //蓝牙if #available(iOS 13.1, *) {let autostate CBManager.authorizationif(autostate .notDetermined){print("")self.manager CBCentralManager(delegate: nil, queue: DispatchQueue.main,options: [CBCentralManagerOptionShowPo…...

用LangGraph、 Ollama,构建个人的 AI Agent

如果你还记得今年的 Google I/O大会&#xff0c;你肯定注意到了他们今年发布的 Astra&#xff0c;一个人工智能体&#xff08;AI Agent&#xff09;。事实上&#xff0c;目前最新的 GPT-4o 也是个 AI Agent。 现在各大科技公司正在投入巨额资金来创建人工智能体&#xff08;AI …...

ubuntu20.04系统编译yolov8-obb.cpp代码记录

任务内容 在做ncnn-yolov8-obb模型安卓端移植的过程中&#xff0c;对开源代码进行调试。为了确认开源代码yolov8-obb.cpp可以移植开发&#xff0c;先对代码进行复现。因此在linux系统下编译yolov8-obb.cpp代码&#xff0c;验证项目中的代码是可运行的。然后再把这个代码中的模…...

JavaScript的数组与函数

数组 <script type"text/javascript">/** 知识点&#xff1a;数组* 理解&#xff1a;一维数组的容器* 概念&#xff1a;* 1.数组中的数据叫做元素* 2.元素都有编号叫做下标/索引* 3.下标从0开始* 注意&#xff1a;* 1.数组作为数据的容器…...

opencv--把cv::Mat数据转为二进制数据的保存和读取

保存 #include <opencv2/opencv.hpp> #include <iostream> #include <fstream>void saveMatToBinary(const cv::Mat& mat, const std::string& filename) {std::ofstream ofs(filename, std::ios::binary);if (!ofs.is_open()) {std::cerr <<…...

【微信小程序开发实战项目】——个人中心页面的制作

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…...

基于MCU平台的HMI开发的性能优化与实战(下)

继上篇《基于MCU平台的HMI开发的性能优化与实战&#xff08;上&#xff09;》深入探讨了提升MCU平台HMI开发效率和应用性能的策略后&#xff0c;本文将专注于NXP i.MX RT1170 MCU平台的仪表盘开发实践。我们将重点介绍Qt for MCUs的优化技巧&#xff0c;展示如何通过实际案例应…...

评估测试用例有效性 5个方面

评估测试用例的有效性是确保软件测试活动能够达到预期目标的关键步骤&#xff0c;有助于测试团队优化测试计划&#xff0c;提高测试效率&#xff0c;减少返工&#xff0c;节省成本。如果缺乏对测试用例的有效性评估&#xff0c;可能会导致测试用例无法覆盖关键功能点&#xff0…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...