图像特征 - 角点
一、harris角点检测
1. 基本原理
① 推导过程

对于图像 l(x, y) ,当在点 (x, y) 处平移 (Δx,Δy) 后的自相似性:
c(x,y;Δx,Δy)=∑(u,v)∈W(x,y)w(u,v)(I(u,v)−I(u+Δx,v+Δy))2
w(x,y) 是以点
(x,y) 为中心的窗口,既可是常数(盒状滤波器),也可以是高斯加权函数:⎣⎡121242121⎦⎤

可以基于泰勒展开对计算过程进行简化,也就是对图像I(x, y) 在进行平移(Δx,Δ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
其中, Ix,Iy是I(x,y)的偏导数
近似可得:
c(x,y;Δx,Δy)≈∑w(Ix(u,v)Δx+Iy(u,v)Δy)2=[Δx,Δy]M(x,y)[ΔxΔy]
其中M:
M(x,y)=∑ω[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Δx2+2CΔxΔy+BΔy2
A=∑wIx2,B=∑wIy2,C=∑wIxIy
上面的M矩阵为实对称矩阵,可以使用可逆矩阵进行相似对角化
二次项系数本质上就是一个椭圆函数,椭圆方程为:
AΔx2+2CΔxΔy+BΔy2=constant=[Δx,Δy]M(x,y)[ΔxΔy]
但是这个椭圆并不标准,为了能使其标准化,则我们应该滤除C的干扰,所以我们应该对M矩阵进行相似对角化,最终M矩阵会化身为:[λminλmax],而椭圆方程也会转化为:λminΔx2+λmaxΔy2=1

② 判别方法

角点响应R值
- R=detM−α(traceM)2其中,
detM=λ1λ2、traceM=λ1+λ2
- 判别方式:
- R > 0: 角点
- R < 0: 边界
- R = 0: 平坦
最后要使用NMS,非极大值抑制来进行最终遴选
二、工具包
cv2.cornerHarris()
- img:数据类型为float32的输入图像,最好是灰度图
- blockSize:角点检测中指定区域的大小
- ksize:Sobel算子中求导使用的窗口大小
- k:取值参数为[0.04, 0.06],一般为0.04
import cv2
import numpy as np
%matplotlib inline
def cv_show(name,image):
cv2.imshow(name,image)
cv2.waitKey(0)
cv2.destroyAllWindows()
img = cv2.imread('chessboard.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv_show('Gray', gray)
cornerHarris函数的返回值只是计算出来的R结果,这个结果还需进行NMS
com = img.copy()
res = cv2.cornerHarris(gray, 2, 3, 0.04)
img[res > 0.01 * res.max()] = [0,0,255]
res = np.hstack([com, img])
cv_show('Result', res)
