1.1 什么是角点?
通常我们认为三角形有3个角点,矩形有4个角点,角点是两条边的交点;在图像中,角点是有某些特征的图像点,有坐标,代表着一些局部极值。
1.2 图像上的像素点?
1、边缘点 2、角点 3、平坦区域
1.3 原理: 在图像上某一点在任意方向的一个微小变动都会引起很大的灰度变化,这就是角点。
2.1 Harris函数API
void cornerHarris( InputArray src, OutputArray dst, int blockSize,
int ksize, double k,
int borderType = BORDER_DEFAULT );
参数src:单通道8位或32位浮点数图。
参数dst:函数调用后的运算结果存放在这,即存放的是角点检测的响应值,和原图一样的大小和类型。 d s t ( x , y ) = d e t M − k ∗ ( t r M ) 2 dst(x,y)=detM-k\ast (trM)^{2} dst(x,y)=detM−k∗(trM)2
参数blockSize:窗口邻域大小。
参数ksize:表示Sobel()算子的孔径大小,Sobel()算子用来计算偏导数 I x 、 I y I_{x}、I_{y} Ix、Iy。
参数k:Harris函数的参数,一般默认为0.04~0.06。
参数borderType:扩充边界类型。
2.2 Harris角点检测原理
使用一个固定窗口在图像任意方向上进行滑动,比较滑动前与滑动后窗口对应位置像素值的变化,如果在任意方向上像素值变化很大,那么就认为该窗口中有角点。
上图中,那么窗口滑动前与滑动后对应的窗口中的像素变化用数学描述如下:
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
显然 E ( u , v ) E(u,v) E(u,v)越大,越可能存在角点。
其中: ( u , v ) (u,v) (u,v)表示窗口(或中心点)相对于原图中心点的偏移量(或偏移方向)。
( x , y ) (x,y) (x,y)表示窗口对应的像素值的坐标位置。
w ( x , y ) w(x,y) w(x,y)是窗口权重系数,表示窗口内对应的像素值的权重系数,一般设置为二维高斯分布。
通常的窗口权重系数有两种:
对 E ( u , v ) E(u,v) E(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 + u , y + v ) = I ( x , y ) + u I x + v I y I(x+u,y+v)=I(x,y)+uI_{x}+vI_{y} I(x+u,y+v)=I(x,y)+uIx+vIy
所以 E ( u , v ) = ∑ x , y w ( x , y ) [ u I x + v I y ] 2 E(u,v)=\sum_{x,y} w(x,y)[uI_{x}+vI_{y}]^{2} E(u,v)=∑x,yw(x,y)[uIx+vIy]2
= ∑ x , y w ( x , y ) ( [ u v ] [ I x I x I x I y I y I x I y I y ] [ u v ] ) =\sum_{x,y} w(x,y)(\begin{bmatrix}u &v \end{bmatrix}\begin{bmatrix}I_{x}I_{x} &I_{x}I_{y} \\ I_{y}I_{x} &I_{y}I_{y} \end{bmatrix}\begin{bmatrix}u\\v \end{bmatrix}) =∑x,yw(x,y)([uv][IxIxIyIxIxIyIyIy][uv])
= [ u v ] ( ∑ x , y w ( x , y ) [ I x I x I x I y I y I x I y I y ] ) [ u v ] =\begin{bmatrix}u &v \end{bmatrix}(\sum_{x,y} w(x,y)\begin{bmatrix}I_{x}I_{x} &I_{x}I_{y} \\ I_{y}I_{x} &I_{y}I_{y} \end{bmatrix})\begin{bmatrix}u\\v \end{bmatrix} =[uv](∑x,yw(x,y)[IxIxIyIxIxIyIyIy])[uv]
令 M = ∑ x , y w ( x , y ) [ I x I x I x I y I y I x I y I y ] M=\sum_{x,y} w(x,y)\begin{bmatrix}I_{x}I_{x} &I_{x}I_{y} \\ I_{y}I_{x} &I_{y}I_{y} \end{bmatrix} M=∑x,yw(x,y)[IxIxIyIxIxIyIyIy],可以看出 E ( u , v ) E(u,v) E(u,v)是一个二次型 f = A T X A f=A^{T}XA f=ATXA,
其中 f f f代表 E ( u , v ) E(u,v) E(u,v), X X X代表 M M M,而 M M M是个实对称矩阵,有两个特征根 λ 1 \lambda _{1} λ1、 λ 2 \lambda _{2} λ2。
由正定矩阵的定义:设X是n阶方阵,如果对任何非零向量A,都有 f = A T X A f=A^{T}XA f=ATXA>
0,就称X为正定矩阵。因为 E ( u , v ) E(u,v) E(u,v)始终大于0,这里不考虑等于0的情况,所以 M M M是正
定矩阵,所以 λ 1 、 λ 2 \lambda _{1}、\lambda _{2} λ1、λ2都是正数。
由二次型定理可知 E ( u , v ) E(u,v) E(u,v)可以转化为标准型:
f = λ 1 y 1 2 + λ 2 y 2 2 f=\lambda _{1}y_{1}^{2}+\lambda _{2}y_{2}^{2} f=λ1y12+λ2y22
令 E ( u , v ) = 常 数 E(u,v)=常数 E(u,v)=常数;即 f = 常 数 f=常数 f=常数;则标准型可以表示为一个椭圆。
上图中椭圆的性质:特征根影响灰度值得变化,越大变化越快。
①若 λ 1 \lambda _{1} λ1、 λ 2 \lambda _{2} λ2均很大,那么在水平和垂直方向均变化很快,窗口中含有角点。
②若 λ 1 \lambda _{1} λ1很大、 λ 2 \lambda _{2} λ2很小,那么在水平或垂直其中一个方向变化很快,窗口中含有边缘。
③若 λ 1 \lambda _{1} λ1、 λ 2 \lambda _{2} λ2均很小,那么在水平和垂直方向均变化很慢,窗口处在平坦区域。
令响应值 R = λ 1 ⋅ λ 2 − k ⋅ ( λ 1 + λ 2 ) 2 = d e t M − k ⋅ ( t r M ) 2 R=\lambda _{1}\cdot\lambda _{2}-k\cdot(\lambda _{1}+\lambda _{2})^{2}=detM-k\cdot(trM)^{2} R=λ1⋅λ2−k⋅(λ1+λ2)2=detM−k⋅(trM)2
①若 λ 1 \lambda _{1} λ1、 λ 2 \lambda _{2} λ2均很大, ( λ 1 (\lambda _{1} (λ1+ λ 2 ) 2 ≈ 4 ⋅ λ 1 ⋅ λ 2 \lambda _{2})^{2}\approx4\cdot\lambda _{1}\cdot\lambda _{2} λ2)2≈4⋅λ1⋅λ2,且 k k k远小于1,所以 1 − 4 k ≈ 1 1-4k\approx1 1−4k≈1,
则 R ≈ ( 1 − 4 k ) λ 1 λ 2 ≈ λ 1 λ 2 R\approx(1-4k)\lambda _{1}\lambda _{2}\approx\lambda _{1}\lambda _{2} R≈(1−4k)λ1λ2≈λ1λ2。
②若 λ 1 > > λ 2 \lambda _{1}>>\lambda_{2} λ1>>λ2且 k ⋅ λ 1 > > λ 2 k\cdot\lambda _{1}>>\lambda _{2} k⋅λ1>>λ2,则 R ≈ λ 2 ⋅ λ 1 − k ⋅ λ 1 2 < 0 R\approx\lambda _{2}\cdot\lambda _{1}-k\cdot\lambda _{1}^{2} <0 R≈λ2⋅λ1−k⋅λ12<0。
③若 λ 1 \lambda _{1} λ1、 λ 2 \lambda _{2} λ2均很小,则 R ≈ 0 R\approx0 R≈0。
结论:响应大于0窗口中含有角点,小于0窗口中含有边缘,等于0窗口处在平坦区域
2.3 Harris角点检测算法具有性质
①Harris角点检测算子对亮度和对比度的仿射变换不敏感
图像亮度和对比度的仿射变换并不改变Harris角点响应极值点出现的位置。
②Harris角点检测算子具有旋转不变性
Harris角点检测算子使用的是角点附近的区域灰度的二阶矩矩阵,其中二阶矩矩阵可以表示成一个椭圆,当旋转椭圆时,特征值不发生变化,即响应值不变,角点依然存在,所以具有旋转不变性。
③Harris角点检测算子不具有尺度不变性
如图当原图被缩小时,窗口尺寸不变的情况下,边缘可能被检测成角点。
2.4 Harris角点检测算法实现
①用Sobel()算子计算窗口对应的原图位置的偏导数(或者叫梯度) I x 、 I y I_{x}、I_{y} Ix、Iy
②计算图像两个方向的梯度乘积:
I x ⋅ I x 、 I x ⋅ I y 、 I y ⋅ I x 、 I y ⋅ I y I_{x}\cdot I_{x}、I_{x}\cdot I_{y}、I_{y}\cdot I_{x}、I_{y}\cdot I_{y} Ix⋅Ix、Ix⋅Iy、Iy⋅Ix、Iy⋅Iy
③使用高斯函数进行加权。
④计算每个像素的响应值R
⑤进行阈值化,设置阈值去除掉一些角点
⑥进行非极大值抑制,去除掉簇拥在一起的角点