计算机视觉 (九)- 角点检测(Harris)

首先,我们为什么要检测角点。一张图片有很多的特征,这些特征决定了物体。在角点处图像的梯度会有不小的变化,所以,可以用焦点作为判定的一个依据。      

Harris Corner是最典型的角点检测子Corner Detector角点经常被检测在边缘的交界处、被遮挡的边缘、纹理性很强的部分。满足这些条件一般都是稳定的、重复性比较高的点,所以实际上他们是不是角点并不重要(因为我们的目标就是找一些稳定、重复性高的点以作为特征点)。

       Harris Corner基于二阶矩阵:

       

        这个矩阵描述了局部邻域内梯度的分布情况。矩阵的两个特征值可以用来描述两个主要方向上信号的变化,因此特征值可以用来判决是否为特征点。Harris采用的判别方法是:

    

       显而易见,cornerness的值越大,对应的两个特征值都应该很大,其中λ取0.04,是为了抑制比较明显的直线。最后对整幅图像得到的cornerness做一个非极大抑制,得到最后的特征点。Harris角点具有的优点是平移不变、旋转不变,能克服一定光照变化。


计算机视觉 (九)- 角点检测(Harris)_第1张图片

import matplotlib.pyplot as plt
import numpy as np
import cv2

img = cv2.imread( './imgs/10.jpg' )
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
dst = cv2.cornerHarris(gray, 2 , 3 , 0.04 )#使用Harris
pointdst = cv2.dilate(dst, None )

threshold = 0.1 * dst.max()

for i in range ( 0 ,dst.shape[ 0 ]):
for j in range ( 0 ,dst.shape[ 1 ]):
if (dst[i,j] > threshold):
cv2.circle(img,(j,i), 1 ,( 255 , 0 , 0 ), 2 )
plt.imshow(img)
plt.show()

你可能感兴趣的:(cv)