Lesson4-2:OpenCV图像特征提取与描述---Harris和Shi-Tomas算法

学习目标

  • 理解Harris和Shi-Tomasi算法的原理
  • 能够利用Harris和Shi-Tomasi进行角点检测

1 Harris角点检测

1.1 原理

H a r r i s Harris Harris角点检测的思想是通过图像的局部的小窗口观察图像,角点的特征是窗口沿任意方向移动都会导致图像灰度的明显变化,如下图所示:
在这里插入图片描述
将上述思想转换为数学形式,即将局部窗口向各个方向移动 ( u , v ) (u,v) (u,v)并计算所有灰度差异的总和,表达式如下:
E ( u , v ) = ∑ x , y w ( x , y ) [ I ( x + u , y + v ) − I ( x , y ) ] 2 E(u,v)=\sum_{x,y}w(x,y)[I(x+u,y+v)-I(x,y)]^{2} E(u,v)=x,yw(x,y)[I(x+u,y+v)I(x,y)]2

其中 I ( x , y ) I(x,y) I(x,y)是局部窗口的图像灰度, I ( x + u , y + v ) I(x+u,y+v) I(x+u,y+v)是平移后的图像灰度, w ( x , y ) w(x,y) w(x,y)是窗口函数,该可以是矩形窗口,也可以是对每一个像素赋予不同权重的高斯窗口,如下所示:
在这里插入图片描述
角点检测中使 E ( u , v ) E(u,v) E(u,v)的值最大。利用一阶泰勒展开有:
I ( x + u , y + v ) = I ( x , y ) + I x u + I u v I(x+u,y+v)=I(x,y)+I_{x}u+I_{u}v I(x+u,y+v)=I(x,y)+Ixu+Iuv

其中 I x I_{x} Ix I y I_{y} Iy是沿x和y方向的导数,可用sobel算子计算。

推导如下:
在这里插入图片描述
M M M矩阵决定了 E ( u , v ) E(u,v) E(u,v)的取值,下面我们利用 M M M来求角点, M M M I x I_{x} Ix I ​ y I​_{y} Iy​​ 的二次项函数,可以表示成椭圆的形状,椭圆的长短半轴由 M M M的特征值 λ ​ 1 λ​_{1} λ1 λ ​ 2 λ​_{2} λ2决定,方向由特征矢量决定,如下图所示:
在这里插入图片描述

椭圆函数特征值与图像中的角点、直线(边缘)和平面之间的关系如下图所示。
在这里插入图片描述
共可分为三种情况:

  • 图像中的直线。一个特征值大,另一个特征值小, λ 1 > > λ 2 λ_{1}>>λ_{2} λ1>>λ2 λ 2 > > λ 1 λ_{2}>>λ_{1} λ2>>λ1。椭圆函数值在某一方向上大,在其他方向上小。
  • 图像中的平面。两个特征值都小,且近似相等;椭圆函数数值在各个方向上都小。
  • 图像中的角点。两个特征值都大,且近似相等,椭圆函数在所有方向都增大

H a r r i s Harris Harris给出的角点计算方法并不需要计算具体的特征值,而是计算一个角点响应值 R R R来判断角点。
R R R的计算公式为:

R = d e t M − α ( t r a c e M ) 2 R = detM-\alpha (traceM)^{2} R=detMα(traceM)2

式中, d e t M detM detM为矩阵 M M M的行列式; t r a c e M traceM traceM为矩阵 M M M的迹; α α α为常数,取值范围为 0.04   0.06 0.04~0.06 0.04 0.06。事实上,特征是隐含在 d e t M detM detM t r a c e M traceM traceM中,因为:

d e t M = λ 1 λ 2 detM=λ_{1}λ_{2} detM=λ1λ2
t r a c e M = λ 1 + λ 2 traceM=λ_{1}+λ_{2} traceM=λ1+λ2

那我们怎么判断角点呢?如下图所示:

在这里插入图片描述

  • R R R为大数值的正数时是角点
  • R R R为大数值的负数时是边界
  • R R R为小数是认为是平坦区域

1.2 实现

在OpenCV中实现Hariis检测使用的API是:

dst=cv.cornerHarris(src, blockSize, ksize, k)

参数:

  • img:数据类型为 float32 的输入图像。

  • blockSize:角点检测中要考虑的邻域大小。

  • ksize:sobel求导使用的核大小

  • k :角点检测方程中的自由参数,取值参数为 [0.04,0.06].

示例:

import cv2 as cv
import numpy as np 
import matplotlib.pyplot as plt
# 1 读取图像,并转换成灰度图像
img = cv.imread('./image/chessboard.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 2 角点检测
# 2.1 输入图像必须是 float32
gray = np.float32(gray)

# 2.2 最后一个参数在 0.04 到 0.05 之间
dst = cv.cornerHarris(gray,2,3,0.04)
# 3 设置阈值,将角点绘制出来,阈值根据图像进行选择
img[dst>0.001*dst.max()] = [0,0,255]
# 4 图像显示
plt.figure(figsize=(10,8),dpi=100)
plt.imshow(img[:,:,::-1]),plt.title('Harris角点检测')
plt.xticks([]), plt.yticks([])
plt.show()

结果如下:
在这里插入图片描述
Harris角点检测的优缺点:

优点:

  • 旋转不变性,椭圆转过一定角度但是其形状保持不变(特征值保持不变)
  • 对于图像灰度的仿射变化具有部分的不变性,由于仅仅使用了图像的一介导数,对于图像灰度平移变化不变;对于图像灰度尺度变化不变

缺点:

  • 对尺度很敏感,不具备几何尺度不变性。
  • 提取的角点是像素级的

2 Shi-Tomasi角点检测

2.1 原理

S h i − T o m a s i Shi-Tomasi ShiTomasi算法是对 H a r r i s Harris Harris角点检测算法的改进,一般会比 H a r r i s Harris Harris算法得到更好的角点。 H a r r i s Harris Harris 算法的角点响应函数是将矩阵 M M M 的行列式值与 M M M 的迹相减,利用差值判断是否为角点。后来 S h i Shi Shi T o m a s i Tomasi Tomasi 提出改进的方法是,若矩阵 M M M的两个特征值中较小的一个大于阈值,则认为他是角点,即:

R = m i n ( λ ​ 1 ​​ , λ 2 ) R=min(λ_{​1} ​​ ,λ_{2}) R=min(λ​1​​,λ2)

如下图所示:
在这里插入图片描述
从这幅图中,可以看出来只有当 λ 1 λ_{1} λ1 λ 2 λ_{2} λ2 都大于最小值时,才被认为是角点。

2.2 实现

在OpenCV中实现Shi-Tomasi角点检测使用API:

corners = cv2.goodFeaturesToTrack ( image, maxcorners, qualityLevel, minDistance )

参数:

  • Image: 输入灰度图像
  • maxCorners : 获取角点数的数目。
  • qualityLevel:该参数指出最低可接受的角点质量水平,在0-1之间。
  • minDistance:角点之间最小的欧式距离,避免得到相邻特征点。

返回:

  • Corners: 搜索到的角点,在这里所有低于质量水平的角点被排除掉,然后把合格的角点按质量排序,然后将质量较好的角点附近(小于最小欧式距离)的角点删掉,最后找到 m a x C o r n e r s maxCorners maxCorners个角点返回。
    示例:
import numpy as np 
import cv2 as cv
import matplotlib.pyplot as plt
# 1 读取图像
img = cv.imread('./image/tv.jpg') 
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
# 2 角点检测
corners = cv.goodFeaturesToTrack(gray,1000,0.01,10)  
# 3 绘制角点
for i in corners:
    x,y = i.ravel()
    cv.circle(img,(x,y),2,(0,0,255),-1)
# 4 图像展示
plt.figure(figsize=(10,8),dpi=100)
plt.imshow(img[:,:,::-1]),plt.title('shi-tomasi角点检测')
plt.xticks([]), plt.yticks([])
plt.show()

结果如下:
在这里插入图片描述


总结

  1. Harris算法

    思想:通过图像的局部的小窗口观察图像,角点的特征是窗口沿任意方向移动都会导致图像灰度的明显变化。

    API: cv.cornerHarris()

  2. Shi-Tomasi算法

    对Harris算法的改进,能够更好地检测角点

    API: cv2.goodFeatureToTrack()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java实现粤语歌曲0243填词法

粤语歌曲填词法 一、前言 转化成数字歌。对每个音符,提供配合广东话声调的字,选出成为歌词。可以在网上创作,或下载到自己电脑中使用。 简谱 3656536,歌词 落花满天蔽月光。 唱起来配合乐曲音调。这叫做‘叶韵’,又叫…

UE4 植物生长

这个可以改变SplineMesh朝向

android 输入法demo

背景: 一个简单的android输入法demo,支持输入png、gif,jpeg、webp等格式。 此示例演示如何编写一个应用程序,该应用程序接受使用 Commit Content API 从键盘发送的丰富内容(例如图像)。 用户通常希望通过表…

推荐一本AI+医疗书:《机器学习和深度学习基础以及医学应用》,附21篇精选综述

当代医学仍然存在许多亟待解决的问题,比如日益增加的成本、医疗服务水平的下降...但近几年AI技术的发展却给医疗领域带来了革命性的变化,因此AI医疗迅速兴起。 从目前已知的成果来看,人工智能在医学领域的应用已经相当广泛,智能诊…

AJAX学习笔记1发送Get请求

传统请求有哪些方式,及缺点 传统请求有哪些? 1.直接在浏览器地址栏上输入URL. 2.点击超连接. <a href"/上下文/请求地址">超链接请求</a> ---->相对路径 <a href"http://www.baidu.com">超链接请求</a> ---->绝对路…

【Python】PySpark

前言 Apache Spark是用于大规模数据&#xff08;large-scala data&#xff09;处理的统一&#xff08;unified&#xff09;分析引擎。 简单来说&#xff0c;Spark是一款分布式的计算框架&#xff0c;用于调度成百上千的服务器集群&#xff0c;计算TB、PB乃至EB级别的海量数据…

知识图谱实战应用26-基于知识图谱构建《本草纲目》的中药查询与推荐项目应用

大家好,我是微学AI,今天给大家介绍一下知识图谱实战应用26-基于知识图谱构建《本草纲目》的中药查询与推荐项目应用,本文通过Py2neo连接到知识图谱数据库,系统实现了中药的快速查询、关系分析、智能推荐和知识展示等功能。用户可以输入中药的名称或特征进行查询,系统将从知…

分页功能实现

大家好 , 我是苏麟 , 今天聊一聊分页功能 . Page分页构造器是mybatisplus包中的一个分页类 . Page分页 引入依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.1</ver…

【LeetCode每日一题】——274.H指数

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 排序 二【题目难度】 中等 三【题目编号】 274.H指数 四【题目描述】 给你一个整数数组 ci…

linux系统中串口驱动框架基本分析(经典)

第一&#xff1a;区分不同的终端类型 串行端口终端&#xff08;/dev/ttySn&#xff09; 串行端口终端&#xff08;Serial Port Terminal&#xff09;是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。 有段时间这些串行端口设备通常被称为终…

Python:列表推导式

相关阅读 Python专栏https://blog.csdn.net/weixin_45791458/category_12403403.html?spm1001.2014.3001.5482 列表推导式使得创建特定列表的方式更简洁。常见的用法为&#xff0c;对序列或可迭代对象中的每个元素应用某种操作&#xff0c;用生成的结果创建新的列表&#xff…

Python—匹配字段

1. 「概述」 在日常开发中&#xff0c;经常需要对数据中的某些字段进行匹配&#xff0c;但这些字段可能存在微小的差异。例如&#xff0c;同一个招聘岗位的数据中&#xff0c;省份字段可能有“广西”、“广西壮族自治区”和“广西省”等不同的写法。为了处理这些情况&#xff…

(数字图像处理MATLAB+Python)第十章图像分割-第四,五节:分水岭分割和综合案例

文章目录 一&#xff1a;分水岭分割&#xff08;1&#xff09;原理&#xff08;2&#xff09;程序 二&#xff1a;综合案例&#xff1a;答题卡图像分割&#xff08;1&#xff09;设计思路&#xff08;2&#xff09;各模块设计&#xff08;3&#xff09;代码 一&#xff1a;分水…

three.js(二):webpack + three.js + ts

用webpackts 开发 three.js 项目 webpack 依旧是主流的模块打包工具;ts和three.js 是绝配&#xff0c;three.js本身就是用ts写的&#xff0c;ts可以为three 项目提前做好规则约束&#xff0c;使项目的开发更加顺畅。 1.创建一个目录&#xff0c;初始化 npm mkdir demo cd de…

第五章 树与二叉树 二、二叉树的定义和常考考点,WPL的算法

一、定义 二叉树可以用以下方式详细定义&#xff1a; 二叉树是由节点构成的树形结构&#xff0c;每个节点最多可以有两个子节点。每个节点有以下几个属性&#xff1a; 值&#xff1a;存储该节点的数据。左子节点&#xff1a;有一个左子节点&#xff0c;如果没有则为空。右子节…

Visual Studio 2017安装和项目配置

目录 前言1. What、Why and How1.1 What1.2 Why1.3 How 2. 安装3. 创建新项目4. 配置OpenCV库4.1 下载opencv安装包4.2 配置系统环境变量4.3 VS项目环境配置4.4 总结 5. 已有项目添加6. Tips6.1 常用快捷键6.2 字体和颜色选择6.3 配置编译路径 结语下载链接参考 前言 最近因为项…

【STM32教程】第二章 通用输入输出口GPIO

资料下载链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1hsIibEmsB91xFclJd-YTYA?pwdjauj 提取码&#xff1a;jauj 1. GPIO的基本结构 1.1 概述 GPIO&#xff08;General Purpose Input Output&#xff09;意思是通用输入输出口可配置为8种输入输出模式&a…

I IntelliJ IDEA 2023.2 最新解锁方式,支持java20

在 IntelliJ IDEA 2023.1 中&#xff0c;我们根据用户的宝贵反馈对新 UI 做出了大量改进。 我们还实现了性能增强&#xff0c;从而更快导入 Maven&#xff0c;以及在打开项目时更早提供 IDE 功能。 新版本通过后台提交检查提供了简化的提交流程。 IntelliJ IDEA Ultimate 现在支…

【Terraform学习】使用 Terraform创建DynamoDB添加项目(Terraform-AWS最佳实战学习)

本站以分享各种运维经验和运维所需要的技能为主 《python》&#xff1a;python零基础入门学习 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8》暂未更新 《docker学习》暂未更新 《ceph学习》ceph日常问题解…

Django静态文件媒体文件文件上传

文章目录 一、静态文件和媒体文件1.在django中使用静态文件实践2.在django中使用媒体文件 二、文件上传单文件上传实践多文件上传 一、静态文件和媒体文件 媒体文件: 用户上传的文件&#xff0c;叫做media 静态文件:存放在服务器的css,js,image,font等 叫做static1.在django中…