传统图像特征提取方法:边缘与角点

本文深入解析图像处理中的Canny边缘检测、Harris角点检测及SIFT尺度不变特征描述子的原理。Canny算法包括灰度化、高斯滤波、梯度计算、非极大值抑制等步骤;Harris角点检测利用局部窗口判断灰度变化,寻找图像的角点;SIFT特征提取涉及多尺度空间的极值点检测与描述符计算,用于图像匹配。这些技术在计算机视觉和图像处理领域有着广泛应用。
摘要由CSDN通过智能技术生成

补充边缘检测,角点检测,尺度不变的特征描述子的原理

Canny 边缘检测算法

Canny 检测算法包含下面几个阶段:

  • 灰度化
  • 使用高斯滤波器,以平滑图像,滤除噪声。
  • 计算图像中每个像素点的梯度强度和方向
  • 应用非极大值(Non-Maximum Suppression, NMS)抑制,以消除边缘检测带来的杂散响应。
  • 应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
  • 通过抑制孤立的弱边缘最终完成边缘检测。

灰度化

灰度化实际上是一种降维的操作,可以减少计算。

高斯平滑滤波

在实际的图片中,都会包含噪声。但有时候,图片中的噪声会导致图片中边缘信息的消失。对此的解决方案就是使用高斯平滑来减少噪声,即进行高斯模糊操作。该操作是一种滤波操作,与高斯分布有关,下面是一个二维的高斯函数,其中 ( x , y ) (x, y) (x,y)为坐标, σ \sigma σ为标准差:
H ( x , y ) = e − ( x 2 + y 2 / 2 σ 2 ) H(x,y) = e^{-(x^2 + y^2/ 2\sigma^2)} H(x,y)=e(x2+y2/2σ2)
进行高斯滤波之前,需要先得到一个高斯滤波器(kernel)。如何得到一个高斯滤波器?其实就是将高斯函数离散化,将滤波器中对应的横纵坐标索引代入高斯函数,即可得到对应的值。不同尺寸的滤波器,得到的值也不同,下面是 (2k+1)x(2k+1) 滤波器的计算公式 :
H [ i , j ] = 1 2 π σ 2 e − ( i − k − 1 ) 2 + ( j − k − 1 ) 2 2 σ 2 H[i,j] = \frac{1}{2\pi \sigma ^{2}} e^{- \frac{(i-k-1)^{2} + (j-k-1)^{2}}{2\sigma^{2}}} H[i,j]=2πσ21e2σ2(ik1)2+(jk1)2
img

若图像中一个3x3的窗口为A,要滤波的像素点为e,则经过高斯滤波之后,像素点e的亮度值为:

img

其中*为卷积符号,sum表示矩阵中所有元素相加求和。常用尺寸为 5x5,σ=1.4 的高斯滤波器。

梯度幅值

边缘是图像强度快速变化的地方,可以通过图像梯度幅值,即计算图像强度的一阶导数来识别这些地方。由于图片是离散的,可以用有限导数来近似图片的梯度:
∂ f ∂ x = f ( x n + 1 , y ) − f ( x n , y ) Δ x \frac{\partial f}{\partial x} = \frac{f(x_{n+1},y) - f(x_{n},y) }{\Delta x} xf=Δxf(xn+1,y)f(xn,y)
梯度幅值为:
M = ∂ f ∂ x 2 + ∂ f ∂ y 2 M = \sqrt{\frac{\partial f}{\partial x}^{2}+ \frac{\partial f}{\partial y}^{2}} M=xf2+yf2
梯度方向为:
θ = a r t a n − 1 ( ∂ f ∂ y / ∂ f ∂ x ) \theta = artan^{-1}(\frac{\partial f}{\partial y} / \frac{\partial f}{\partial x}) θ=artan1(yf/xf)

非极大值抑制(NMS)

非极大值抑制是一种边缘稀疏技术,非极大值抑制的作用在于“瘦”边。对图像进行梯度计算后,仅仅基于梯度值提取的边缘仍然很模糊,也就是模糊。对边缘有且应当只有一个准确的响应。而非极大值抑制则可以帮助将局部最大值之外的所有梯度值抑制为0,对梯度图像中每个像素进行非极大值抑制的算法是:

  • 将当前像素的梯度强度与沿正负梯度方向上的两个像素进行比较。

  • 如果当前像素的梯度强度与另外两个像素相比最大,则该像素点保留为边缘点,否则该像素点将被抑制。

    下面说说 NMS 的细节内容。NMS 在 4 个方向上进行,分别是 0,90,45,135,没有角度包含两个领域,因此,一共用八个领域:上,下,左,右,左上,左下,右上,右下,如下图所示,C 周围的 8 个点就是其附近的八个领域。
    image-20200626155841738

    NMS 是要找出局部最大值,因此,需要将当前的像素的梯度,与其他方向进行比较。如下图所示,g1,g2,g3,g4 分别是 C 八个领域中的 4 个点,蓝线是 C 的梯度方向。如果 C 是局部最大值的话,C 点的梯度幅值就要大于梯度方向直线与 g1g2,g4g3 两个交点的梯度幅值,即大于点 dTemp1 和 dTemp2 的梯度幅值。上面提到这种方法无法达到最好的效果,因为 dTemp1 和 dTemp2 不是整像素,而是亚像素。亚像素的意思就是在两个物理像素之间还有像素。
    image-20200626160030080

    双阈值选取

    这个阶段决定哪些边缘是真正的边缘,哪些边缘不是真正的边缘。为此,需要设置两个阈值,minVal 和 maxVal。梯度大于 maxVal 的任何边缘肯定是真边缘,而 minVal 以下的边缘肯定是非边缘,因此被丢弃。位于这两个阈值之间的边缘会基于其连通性而分类为边缘或非边缘,如果它们连接到“可靠边缘”像素,则它们被视为边缘的一部分。否则,也会被丢弃。位于这两个阈值之间的边缘,通过查看它的像素及其8个邻域像素,只要其中一个为强边缘像素,则该弱边缘点就可以保留为真实的边缘。
    image-20200626170526587

Harris 角点检测

算法思想

角点原理来源于人对角点的感性判断,即图像在各个方向灰度有明显变化。

算法的核心是利用局部窗口在图像上进行移动判断灰度发生较大的变化。如图1中,窗口内图像的灰度没有发生变化,那么窗口内就不存在角点;图2,如果窗口在某一个方向移动时,窗口内图像的灰度发生了较大的变化,而在另一些方向上没有发生变化,那么,窗口内的图像可能就是一条直线的线段。各个方向上移动这个特征的小窗口,如图3中,窗口内区域的灰度发生了较大的变化,那么就认为在窗口内遇到了角点。

image

数学建模

根据算法思想,构建数学模型,计算移动窗口的的灰度差值。

img

为了减小计算量,利用泰勒级数进行简化公式:

img

img

M为实对称矩阵,线性代数中有实对称矩阵必能相似对角化。

img
同时正交矩阵有:
p T = P − 1 p^T = P^{-1} pT=P1
因此:
img

可以看出E(u,v)表示的是在u’和v’坐标下的一个椭圆,而u’和v’是相对于u和v坐标系进行了一个旋转。
img

之前我们讨论过,当E(u,v)值大时表示该区域为角点。E(u,v)什么时候值最大呢,有椭圆方程可知即λ1,λ2同时很大时E(u,v)的值会很大。

1.两个特征值都很大 ----------->角点(两个响应方向)
2.一个特征值很大,一个很小----------->边缘(只有一个响应方向)
3.两个特征值都小 ----------->平坦区域(响应都很微弱)

基于上述特征,为了方便快速判断,就引入了角点响应R。只有当λ1,λ2同时很大时,R才会很大,也就表示E(u,v)很大,也就表示该区域是角点。

img

另外R的表达式并不唯一,只要满足上述特征的R都可以作为角点响应。例如:

img

函数原型:cv2.cornerHarris(src, blockSize, ksize, k[, dst[, borderType]])

对于每一个像素 (x,y),在 (blockSize x blockSize) 邻域内,计算梯度图的协方差矩阵 M(x,y)M(x,y)M(x,y),然后通过上面第二步中的角点响应函数得到结果图。图像中的角点可以为该结果图的局部最大值。
即可以得到输出图中的局部最大值,这些值就对应图像中的角点。

  • src - 输入灰度图像,float32类型
  • blockSize - 用于角点检测的邻域大小,就是上面提到的窗口的尺寸
  • ksize - 用于计算梯度图的Sobel算子的尺寸
  • k - 用于计算角点响应函数的参数k,取值范围常在0.04~0.06之间

SIFT

  • 第一步:特征点提取和描述
  • 第二步:特征点配对,找到两幅图像中匹配点的位置
  • 第三步:通过配对点,生成变换矩阵,并对图像1应用变换矩阵生成对图像2的映射图像
  • 第四步:图像2拼接到映射图像上,完成拼接
第四步详细
1. 找到图像1和图像2中最强的匹配点所在的位置
2. 通过映射矩阵变换,得到图像1的最强匹配点经过映射后投影到新图像上的位置坐标
3. 在新图像上的最强匹配点的映射坐标处,衔接两幅图像,该点左侧图像完全是图像1,右侧完全是图像2

参考文献

https://mp.weixin.qq.com/s/DYd-lcHuK-q8dXP74fWJ7g
https://blog.csdn.net/zhu_hongji/article/details/81235643
倘若侵权,联系删除~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值