1.1 简介在图像处理领域中,特征点又被称为兴趣点或者角点,它通常具有旋转不变性和光照不变性和视角不变性等优点,是图像的重要特征之一,常被应用到目标匹配、目标跟踪、三维重建等应用中。点特征主要指图像中的明显点,如突出的角点、边缘端点、极值点等等,用于点特征提取的算子称为兴趣点提取(检测)算子,常用的有Harris角点检测、FAST特征检测、SIFT特征检测及SURF特征检测。 本次博客较为常用而且较为基础的Harris角点检测算法,它的思想以及数学理论能够很好地帮助我们了解兴趣点检测的相关原理。 1.2内容介绍1.2.1基础知识1.角点 使用一个滑动窗口在下面三幅图中滑动,可以得出以下结论:
所以,右图是一个角点。 2.角点类型 下图展示了不同角点的类型,可以发现:如果使用一个滑动窗口以角点为中心在图像上滑动,存在朝多个方向上的移动会引起该区域的像素值发生很大变化的现象。 在这里插入图片描述 3.图像梯度
二维函数的一阶微分的基本定义是: 对于灰度图这样二维数组的图像,它其实就是一个离散的二位函数,说它离散,是因为每个灰度值取值为整数而不是小数,因此ϵ不能无限小,而ϵ的最小单位即是1像素。因此当ϵ取最小值1时,灰度图(离散的二维函数)的一阶微分基本定义是: 我们可以观察到,图像在(x, y)点处x方向和y方向上的梯度相当于2个相邻像素之间的差值。而且一般地,我们会使用两个方向上梯度的绝对值,因为我们只关心图像的灰度值变化大小,而梯度方向只需要知道是水平还是垂直即可,无须知晓到底是具体是向左还是向右,向下还是向上。
但是图像处理中经常使用以下方式(用绝对值加和来近似平方和平方根)来减小计算开支。 再进一步扩展,图像的梯度也常用来判断某个窗口区域是平坦、边缘还是角点。而在边缘检测中,图像某一点的梯度方向是与边缘方向相垂直的,所以知道了梯度的方向,就晓得了边缘的方向,在以后的边缘检测、轮廓检测等知识中会用到。 还有,希望大家记住梯度的计算是以每一个像素点为中心,而非一个区域(比如 3×3)。 “像素值发生很大变化”这一现象可以用图像梯度进行描述。在图像局部内,图像梯度越大表示该局部内像素值变化越大(灰度的变化率越大)。 而图像的梯度在数学上可用微分或者导数来表示。对于数字图像来说,相当于是二维离散函数求梯度,并使用差分来近似导数: 在实际操作中,对图像求梯度通常是考虑图像的每个像素的某个邻域内的灰度变化,因此通常对原始图像中像素某个邻域设置梯度算子,然后采用小区域模板进行卷积来计算,常用的有Prewitt算子、Sobel算子、Robinson算子、Laplace算子等。 1.2.2 Sobel算子简介
1.2.3滤波器
1.2.4 Harris角点检测算法原理1. 算法思想 算法的核心是利用局部窗口在图像上进行移动,判断灰度是否发生较大的变化。如果窗口内的灰度值(在梯度图上)都有较大的变化,那么这个窗口所在区域就存在角点。 这样就可以将 Harris 角点检测算法分为以下三步:
2. 第一步 — 建立数学模型 第一步是通过建立数学模型,确定哪些窗口会引起较大的灰度值变化。 让一个窗口的中心位于灰度图像的一个位置,这个位置的像素灰度值为 ,如果这个窗口分别向 和 方向移动一个小的位移和,到一个新的位置 ,这个位置的像素灰度值就是 就是窗口移动引起的灰度值的变化值。 设为位置处的窗口函数,表示窗口内各像素的权重,最简单的就是把窗口内所有像素的权重都设为1,即一个均值滤波核。 当然,也可以把 设定为以窗口中心为原点的高斯分布,即一个高斯核。如果窗口中心点像素是角点,那么窗口移动前后,中心点的灰度值变化非常强烈,所以该点权重系数应该设大一点,表示该点对灰度变化的贡献较大;而离窗口中心(角点)较远的点,这些点的灰度变化比较小,于是将权重系数设小一点,表示该点对灰度变化的贡献较小。 则窗口在各个方向上移动 所造成的像素灰度值的变化量公式如下: 若窗口内是一个角点,则的计算结果将会很大。 为了提高计算效率,对上述公式进行简化,利用泰勒级数展开来得到这个公式的近似形式: 对于二维的泰勒展开式公式为: 则 为: 其中和是的微分(偏导),在图像中就是求 和 方向的梯度图: 将代入,可得: 提出 u 和 v ,得到最终二次型的近似形式: 其中矩阵M为: 最后是把实对称矩阵对角化处理后的结果,可以把R看成旋转因子,其不影响两个正交方向的变化分量。 (接下来的一小段内容是说:该自相似函数可以视为一个椭圆,而椭圆的形状与特征值的大小相关) 而对于 如果把c视为一个常数, 那么这就是一个二次 型方程,而二次型方程在二维图像中就是一个杨圆。而常数的具体取值并不影响梅圆的形状。而梅圆 的形状又恰好是我们要重点研究的,**准确的说是它的长短轴与我们想要求得特征值密切相关。**因 此在此我们姑且将该二次型方程视为: 图来自二次型的意义是什么?有什么应用? - 马同学的回答 - 知乎 非常赞的回答!推荐阅读。 (接下里这段是说,求特征值为什么借助矩阵,且特征值的意义是什么) 首先,求特征值为什么借助矩阵,这个问题我不该问的,因为求特征值本身就需要借助矩阵运算。 其次,特征值或者确切说特征矩阵意味着什么?首先,矩阵代表着运动,且当矩阵维度没有发生改变时,一个矩阵就包含了两个运动:旋转和拉伸。而如果想把这两个运动分解,可以对矩阵进行正交化操作和特征值分解,由此得到两个矩阵正交矩阵和对角矩阵。 在这里插入图片描述 而正交矩阵就单纯的意味着旋转运动,而对角矩阵就单纯地意味着左右上下拉伸运动。 而对于一个二次方程的二次型矩阵即M(x,y)更换成它对应的对角矩阵,则一个倾斜的椭圆就扶正了。 结合下图进行理解上一段话,如果没能理解,那一定不是你的原因,一定是我没说清楚,具体可以参考文章:二次型的意义是什么?有什么应用? - 马同学的回答 - 知乎 。 经对角化处理后,将两个正交方向的变化分量提取出来,就是 λ1 和 λ2(特征值)。 这里利用了线性代数中的实对称矩阵对角化的相关知识,有兴趣的同学可以进一步查阅相关资料。 3. 第二步—角点响应函数R 现在我们已经得到 的最终形式,别忘了我们的目的是要找到会引起较大的灰度值变化的那些窗口。 灰度值变化的大小则取决于矩阵M,M为梯度的协方差矩阵。在实际应用中为了能够应用更好的编程,所以定义了角点响应函数R,通过判定R大小来判断像素是否为角点。 计算每个窗口对应的得分(角点响应函数R定义): 其中 是矩阵的行列式, 是矩阵的迹。 λ 和 λ 是矩阵的特征值, 是一个经验常数,在范围 (0.04, 0.06) 之间。 的值取决于的特征值,对于角点很大,平坦的区域很小,边缘的为负值。 4. 第三步—角点判定 根据 R 的值,将这个窗口所在的区域划分为平面、边缘或角点。为了得到最优的角点,我们还可以使用非极大值抑制。 注意:Harris 检测器具有旋转不变性,但不具有尺度不变性,也就是说尺度变化可能会导致角点变为边缘。想要尺度不变特性的话,可以关注SIFT特征。 因为特征值 λ1 和 λ2 决定了 R 的值,所以我们可以用特征值来决定一个窗口是平面、边缘还是角点: 平面::该窗口在平坦区域上滑动,窗口内的灰度值基本不会发生变化,所以 值非常小,在水平和竖直方向的变化量均较小,即 和 都较小,那么 λ1 和 λ2 都较小; 边缘:值为负数,仅在水平或竖直方向有较大的变化量,即 和 只有一个较大,也就是 λ1>>λ2 或 λ2>>λ1; 角点: 值很大,在水平、竖直两个方向上变化均较大的点,即 和 都较大,也就是 λ1 和 λ2 都很大。 如下图所示: Harris 角点检测的结果是带有这些分数 R 的灰度图像,设定一个阈值,分数大于这个阈值的像素就对应角点。 1.3 基于OpenCV的实现1. API 在opencv中有提供实现 Harris 角点检测的函数 cv2.cornerHarris,我们直接调用的就可以,非常方便。 函数原型:cv2.cornerHarris(src, blockSize, ksize, k[, dst[, borderType]]) 对于每一个像素 (x,y),在 (blockSize x blockSize) 邻域内,计算梯度图的协方差矩阵 ,然后通过上面第二步中的角点响应函数得到结果图。图像中的角点可以为该结果图的局部最大值。 即可以得到输出图中的局部最大值,这些值就对应图像中的角点。 参数解释: src - 输入灰度图像,float32类型blockSize - 用于角点检测的邻域大小,就是上面提到的窗口的尺寸ksize - 用于计算梯度图的Sobel算子的尺寸k - 用于计算角点响应函数的参数k,取值范围常在0.04~0.06之间
结果: 1.3 总结Harris角点检测的性质可总结如下:
论文:《C.Harris, M.Stephens. “A Combined Corner and Edge Detector”. Proc. of 4th Alvey Vision Conference》 |
|
来自: taotao_2016 > 《图像处理》