本文复现论文A COMBINED CORNER AND EDGE DETECTOR中提出的图像中的物体角点检测算法,也称Harris算法。原文连接https://citeseerx.ist.psu.edu/document?repid=rep1&type=pdf&doi=88cdfbeb78058e0eb2613e79d1818c567f0920e2
该论文所提出的角点检测算法是计算机视觉领域的经典算法,至今仍在计算机视觉领域有着广泛的应用。
该方法对算力几乎没有任何要求,依据图像邻域内灰度值的分布特点来对图像中各区域的角点进行判断。不像深度学习需要依靠大量数据的训练且对数据集分布有依赖性,所以时至今日依然在工业界有着很高的应用价值。
本文所涉及的所有资源的获取方式:这里
正如边缘在灰度图像中在某一个方向上会出现明显的灰度变化,角点在图像中往往是在两个方向上都出现明显的灰度变化。

如在此图中,红点标注处的角点在两个箭头方向的垂直方向上都有明显的灰度变化,两个红色箭头标注出了它的两个灰度变换边缘。
假设我们现在要检测的图片为I,在图像处理中,能够充分体现图像灰度变化特征的是它的方向导数,
与
,分别代表图像I的水平方向导数与竖直方向导数。





def HarrisCornerDetector(image,k=0.02):
# 读取图像
# 将图像转换为numpy数组
I= image
I=np.array(I)
sobel_x = np.array([[0, 0, 0], [-0.5, 0, 0.5], [0, 0, 0]])
sobel_y=np.array([[0,0.5,0],[0,0,0],[0,-0.5,0]])
# 对图像进行水平方向的卷积
I_x = convolve2d(I, sobel_x, mode="same", boundary="symm")
I_y=convolve2d(I,sobel_y,mode='same',boundary='symm')
I2_x=I_x**2
I2_y=I_y**2
Ix_Iy=I_x*I_y
sobel=np.array([[1,1,1],[1,1,1],[1,1,1]])
A=convolve2d(I2_x,sobel,mode="same",boundary="symm")
B=convolve2d(Ix_Iy,sobel,mode="same",boundary="symm")
C=convolve2d(I2_y,sobel,mode="same",boundary="symm")
R=(A*C-B**2)-k*(A+C)**2
R_max=np.max(R[1:-1,1:-1])
C=R
C[C<=(0.2*R_max)]=0
C[C>(0.2*R_max)]=1
return C基础镜像 python:3.9.7
解压后进入HarrisCornerDetector项目路径下 运行以下命令:
pip install -r requirements.txtpython main.py即可看到视频中示例图片的角点检测效果。
修改main.py文件里的默认图片路径

将"data/rice.png"更改为你自己的图片路径即可。
同时,我也找了第二张示例图片放在了data路径下,将"data/rice.png"更换为"data/1.webp",就可以看到演示图片中棋盘的角点检测效果。
[1] Harris C, Stephens M. A combined corner and edge detector[C]//Alvey vision conference. 1988, 15(50): 10-5244.