harris角点检测
1、图像特征
- 平面:平坦区域,没有什么确切的特征,沿水平和竖直方向运动均无明细那变化
- 边界:物体的边缘,位于交界处,沿某一方向移动有明显变换,能大致定位到
- 角点:物体的一些角落,沿水平和竖直两个方向移动均会发生明显变化
2、基本数学原理
对于图像I(x, y),当在点的(x, y)出平移(
Δ
\Delta
Δx,
Δ
\Delta
Δy)后的自相似性:
c
(
x
,
y
;
Δ
x
,
Δ
y
)
=
∑
(
u
,
v
)
ϵ
W
(
x
,
y
)
ω
(
u
,
v
)
(
I
(
u
,
v
)
−
I
(
u
+
Δ
x
,
v
+
Δ
y
)
)
2
c(x,y;\Delta x,\Delta y)=\sum_{(u,v)\epsilon W(x,y)} \omega (u,v)(I(u,v)-I(u+\Delta x,v+\Delta y))^2
c(x,y;Δx,Δy)=(u,v)ϵW(x,y)∑ω(u,v)(I(u,v)−I(u+Δx,v+Δy))2
W(x,y)是以点(x,y)为中心的窗口,即可是常数,也可以是高斯加权函数
I(u,v)为图像灰度
I
(
u
+
Δ
x
,
v
+
Δ
y
)
I(u+\Delta x,v+\Delta y)
I(u+Δx,v+Δy)是平移后的图像灰度
求解:
基于泰勒展开,对图像I(x,y)在平移
(
Δ
x
,
Δ
y
)
(\Delta x,\Delta y)
(Δx,Δy)后进行一阶近似:
I
(
u
+
Δ
x
,
v
+
Δ
y
)
=
I
(
u
,
v
)
+
I
x
(
u
,
v
)
Δ
x
+
I
y
(
u
,
v
)
Δ
y
+
O
(
Δ
x
2
,
Δ
y
2
)
≈
I
(
u
,
v
)
+
I
x
(
u
,
v
)
Δ
x
+
I
y
(
u
,
v
)
Δ
y
I(u+\Delta x,v+\Delta y)=I(u,v)+I_x(u,v)\Delta x+I_y(u,v)\Delta y +O(\Delta x^2,\Delta y^2)\approx I(u,v)+I_x(u,v)\Delta x+I_y(u,v)\Delta y
I(u+Δx,v+Δy)=I(u,v)+Ix(u,v)Δx+Iy(u,v)Δy+O(Δx2,Δy2)≈I(u,v)+Ix(u,v)Δx+Iy(u,v)Δy
其中
I
x
I_x
Ix,
I
y
I_y
Iy是I(x,y)的偏导数
近似可得:
c
(
x
,
y
;
Δ
x
,
Δ
y
)
≈
∑
(
u
,
v
)
ϵ
W
(
x
,
y
)
(
I
(
u
,
v
)
−
I
(
u
+
Δ
x
,
v
+
Δ
y
)
)
2
=
[
Δ
x
,
Δ
y
]
M
(
x
,
y
)
[
Δ
x
Δ
y
]
c(x,y;\Delta x,\Delta y)\approx \sum_{(u,v)\epsilon W(x,y)}(I(u,v)-I(u+\Delta x,v+\Delta y))^2=[\Delta x,\Delta y]M(x,y) \begin{bmatrix} \Delta x\\ \Delta y \end{bmatrix}
c(x,y;Δx,Δy)≈(u,v)ϵW(x,y)∑(I(u,v)−I(u+Δx,v+Δy))2=[Δx,Δy]M(x,y)[ΔxΔy]
其中M:
M
(
x
,
y
)
=
∑
w
[
I
x
(
x
,
y
)
2
I
x
(
x
,
y
)
I
y
(
x
,
y
)
I
x
(
x
,
y
)
I
y
(
x
,
y
)
I
y
(
x
,
y
)
2
]
=
[
∑
w
I
x
(
x
,
y
)
2
∑
w
I
x
(
x
,
y
)
I
y
(
x
,
y
)
∑
w
I
x
(
x
,
y
)
I
y
(
x
,
y
)
∑
w
I
y
(
x
,
y
)
2
]
=
[
A
C
C
B
]
M(x,y) = \sum_w\begin{bmatrix} I_x(x,y)^2 & I_x(x,y)I_y(x,y) \\ I_x(x,y)I_y(x,y) & I_y(x,y)^2 \end{bmatrix} = \begin{bmatrix} \sum_w I_x(x,y)^2 &\sum_w I_x(x,y)I_y(x,y) \\ \sum_w I_x(x,y)I_y(x,y) &\sum_w I_y(x,y)^2 \end{bmatrix} = \begin{bmatrix} A & C \\ C &B \end{bmatrix}
M(x,y)=w∑[Ix(x,y)2Ix(x,y)Iy(x,y)Ix(x,y)Iy(x,y)Iy(x,y)2]=[∑wIx(x,y)2∑wIx(x,y)Iy(x,y)∑wIx(x,y)Iy(x,y)∑wIy(x,y)2]=[ACCB]
化简可得:
c
(
x
,
y
;
Δ
x
,
Δ
y
≈
A
Δ
x
2
+
2
C
Δ
x
Δ
y
+
B
Δ
y
2
)
c(x,y;\Delta x,\Delta y \approx A\Delta x^2+2C\Delta x \Delta y +B\Delta y^2)
c(x,y;Δx,Δy≈AΔx2+2CΔxΔy+BΔy2)
A
=
∑
w
I
x
2
,
B
=
∑
x
I
y
2
,
C
=
∑
w
I
x
I
y
A = \sum_wI_x^2,B = \sum_xI_y^2,C = \sum_wI_xI_y
A=∑wIx2,B=∑xIy2,C=∑wIxIy
二次函数本质上是一个椭圆方程
角点响应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
=
λ
1
λ
2
,
t
r
a
c
e
M
=
λ
1
+
λ
2
detM = \lambda1\lambda2,traceM = \lambda1+\lambda2
detM=λ1λ2,traceM=λ1+λ2
判断:
边界:一个特征值大,一个特征值小,
λ
1
>
>
λ
2
\lambda1>>\lambda2
λ1>>λ2或
λ
1
<
<
λ
2
\lambda1<<\lambda2
λ1<<λ2。自相关函数值在某一个方向上大,在其他方向上小。R<0
平面:两个特征值都小,且近似相等;自相关函数值在各个方向上都小。
R
≈
0
R \approx 0
R≈0
角点:两个特征值都大,且近似相等;自相关函数值在各个方向上都大。R > 0
代码实现
import cv2
import numpy as np
'''
img: 数据类型为float32的图像
blockSize:角点检测中指定区域的大小
ksize:Sobel求导中使用的窗口大小
k:取值参数为[0.04,0.06]
'''
img = cv2.imread('image/chessbroad.jpg')
print('img.shape:',img.shape)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)
dst = cv2.cornerHarris(gray,2,3,0.04)
print('dst.shape:',dst.shape)
img[dst>0.01*dst.max()] = [0,0,255]
cv2.imshow('dst',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果显示: