Harris特征点检测器-兴趣点检测
Harris特征点检测器-兴趣点检测
1 简单介绍
1)特征点也称为兴趣点或者角点,是图像的重要特征之一,对图像图形的理解和分析有很重要的作用。
2)点特征,主要指图像中的明显点,例如我们肉眼看到的突出的角点、边缘端点、极值点等。
3)用于特征点提取的算子称为“兴趣点提取检测算子”,常用的算子有:Harris角点检测、FAST特征检测、SIFT特征检测和SURF特征检测,且这些算子大部分是对于图像的灰度图色彩空间上进行的像素值的计算!
2 基本内容
2.1 概念
在现实世界中,角点对应于物体的拐角,道路的十字路口、丁字路口等。从图像分析的角度来定义角点可以有以下两种定义:
角点可以是两个边缘的角点;
角点是邻域内具有两个主方向的特征点;
举例说明,如下图紫色框图所示,图中左图表示一个平坦区域,窗口内像素值在进行各方向移动过程中没有变化。图中中图表示一个边缘特征,如果沿水平方向移动(梯度方向),窗口内像素值会发生跃变,如果沿边缘移动(平行于边缘),像素值不会发生变化。图中右图表示一个角,窗口内像素值在进行各方向移动过程中均会变化。
2.2 角点类型
不同角点类型如下图所示。
2.3 图像梯度
对于数字图像来说,一幅模糊图像中物体的轮廓不明显,轮廓边缘灰度值变化不强烈,导致层次感不强,清晰图像中的物体轮廓边缘灰度变化明显,层次感强。如何定义这种灰度变化明显不明显?解决方法是使用导数(梯度),衡量图像灰度的变化率,由于图像就是函数,通过引入梯度可以把图像看成二维离散函数,图像梯度就是这个二维离散函数的求导。
使用差分来近似导数:
G
x
(
x
,
y
)
=
H
(
x
+
1
,
y
)
−
H
(
x
+
1
,
y
)
Gx(x,y) =H(x+1,y)- H(x+1,y)
Gx(x,y)=H(x+1,y)−H(x+1,y)
G
y
(
x
,
y
)
=
H
(
x
,
y
+
1
)
−
H
(
x
,
y
−
1
)
Gy(x,y) =H(x,y+1)- H(x,y-1)
Gy(x,y)=H(x,y+1)−H(x,y−1)
通常对原始图像中像素某个邻域使用梯度算子,采用小区域模板进行卷积计算,常用的梯度算子有Prewitt算子、Sobel算子、Robinson算子和Laplace算子等。
3 Harris角点检测算法
3.1 基本原理
利用局部窗口在图像上进行移动,判断灰度是否发生极大的变化,以判定该窗口所在区域是否存在角点。
3.2 基本步骤
计算局部窗口在水平或者垂直方向上移动每一步时的“窗口内部的像素值变化量E”;通过E求得该窗口下的角点响应函数R;将R与自定义的阈值threshold进行比较,以判断该窗口是否包含一个角点特征。即关键流程包括转化为灰度图像、计算差分图像、高斯平滑、计算局部极值、确认角点。
1)当局部区域同时向水平和垂直方向移动,计算局部区域内部像素值变化量
E
(
x
,
y
)
E(x,y)
E(x,y);
2)对于每个窗口,都需要计算其对应的一个角点响应函数
R
R
R;
3)对
R
R
R进行阈值处理,如果
R
>
t
h
r
e
s
h
h
o
l
d
R>threshhold
R>threshhold,表示此局部区域对应一个角点特征。
3.2.1 建立数学模型
通过建立数学模型,判断哪些窗口会引起较大的灰度值变化
假设灰度图像的像素点
(
x
,
y
)
(x,y)
(x,y)为一个窗口中心,像素点灰度值为
I
(
x
,
y
)
I(x,y)
I(x,y),当窗口分别向
x
x
x和
y
y
y方向移动一个较小的位移
u
u
u和
v
v
v,到达一个新的位置
(
x
+
u
,
y
+
v
)
(x+u,y+v)
(x+u,y+v),该位置的像素点灰度值为
I
(
x
+
u
,
y
+
v
)
I(x+u,y+v)
I(x+u,y+v),则窗口移动引起像素点灰度值变化值为
I
(
x
+
u
,
y
+
v
)
−
I
(
x
,
y
)
I(x+u,y+v)-I(x,y)
I(x+u,y+v)−I(x,y)。
假设像素点
(
x
,
y
)
(x,y)
(x,y)处的窗口函数为
w
(
x
,
y
)
w(x,y)
w(x,y),表示窗口内各像素点的权重,而均值滤波核是将窗口内所有像素点的权重均设置为1,高斯核是以窗口中心
(
x
,
y
)
(x,y)
(x,y)的高斯分布。
如果像素点是角点,窗口移动过程中
(
x
,
y
)
(x,y)
(x,y)的灰度值就会发生变化。通过增强窗口中心
(
x
,
y
)
(x,y)
(x,y)附近的权重,减弱窗口边缘的权重,更加凸显图窗口中心
(
x
,
y
)
(x,y)
(x,y)灰度值变化情况。
窗口向各个方向移动
u
u
u和
v
v
v的像素点灰度值变化量公式如下图所示。
近似公式如下所示
其中矩阵
M
M
M为
3.2.2 角点响应函数 R R R
由于像素点灰度值变化是矩阵
M
M
M决定,且
M
M
M为协方差矩阵。通过定义角点响应函数
R
R
R来判断像素点是否为角点。
R
=
d
e
t
(
M
)
−
K
(
t
r
a
c
e
(
M
)
)
2
R=det(M)-K(trace(M))^2
R=det(M)−K(trace(M))2
3.2.3 角点判定
根据角点函数
R
R
R,将窗口所在区域划分为平面、边缘或角点,使用非极大值抑制算法得到最优角点。
由于Harris检测器具有旋转不变性,而不具有尺度不变性,即尺度变化可能会导致将角点误当作边缘,可以使用SIFT特征得到尺度不变性。
3.3 代码实现
3.3.1 API
3.3.2 参考代码
import cv2
import numpy as np
# detector parameters
block_size = 3
sobel_size = 3
k = 0.04
image = cv2.imread('airplane.jpg')
print(image.shape)
height = image.shape[0]
width = image.shape[1]
channels = image.shape[2]
print("width: %s height: %s channels: %s" % (width, height, channels))
# 将一个三维的BGR彩色图像转化为一张二维的灰度图
gray_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 因为cornerHarris的参数类型要求,需要将灰度图转换为float32。
gray_img = np.float32(gray_img)
# 开始运用Harris角点检测算法进行角点的检测
corners_img = cv2.cornerHarris(gray_img, block_size, sobel_size, k)
# 即是构造一个卷积核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
print(kernel)
# dilate 的参数 :图片数组、滤波器的核
dst = cv2.dilate(corners_img, kernel)
print(dst.shape)
cv2.imshow("dst", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 可以看出这个dst的灰度图时一个膨胀后的图像。
for r in range(height):
for c in range(width):
pix=dst[r,c]
if pix>0.05*dst.max():
cv2.circle(image,(c,r),5,(0,0,255),0)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
cv2.imshow("image", image)
cv2.waitKey(0)
3.3.3 结果显示
3.4 总结
1)图像阈值决定角点数量
2)Harris角点检测算子具有光照不变性,即对亮度和对比度的变化不敏感。对亮度和对比度的仿射变换不会改变Harris响应极值点出现的位置。
3)Harris角点检测算子具有旋转不变性
Harris角点检测算子是角点附近区域灰度二阶矩矩阵,二阶矩矩阵可以表示为一个椭圆,而椭圆的长短轴是二阶矩矩阵特征值平方根的倒数。当特征椭圆转动时,特征值不变化,即角点响应值不变化,故Harris角点检测算子具有旋转不变性。
4)Harris角点检测算子不具有尺度不变性
由于尺度变化会将角点变换为边缘,或将边缘变换为角点,故Harris角点检测算子不具有尺度不变性。
3.5 参考文献
1http://citeseerx.ist.psu.edu/viewdoc/downloaddoi=10.1.1.434.4816&rep=rep1&type=pdf
2、https://www.cnblogs.com/polly333/p/5416172.html
3、https://www.cnblogs.com/ronny/p/4009425.html
感谢Datawhale提供相关资料。以及支持和帮助