公司申请网站建设的工作方案,武穴市网站两学一做,网络营销创意方案,阿里域名价格OpenCV与图像处理学习十三——Harris角点检测#xff08;含代码#xff09;一、角点的概念二、Harris角点检测的实现过程三、Harris代码应用一、角点的概念
角点#xff1a; 在现实世界中#xff0c; 角点对应于物体的拐角#xff0c; 道路的十字路口、 丁字路口等。
从…
OpenCV与图像处理学习十三——Harris角点检测含代码一、角点的概念二、Harris角点检测的实现过程三、Harris代码应用一、角点的概念
角点 在现实世界中 角点对应于物体的拐角 道路的十字路口、 丁字路口等。
从图像分析的角度来定义角点可以有以下两种定义
角点可以是两个边缘的交点角点是邻域内具有两个主方向的特征点
角点计算方法
前者通过图像边缘计算 计算量大 图像局部变化会对结果产生较大的影响后者基于图像灰度的方法通过计算点的曲率及梯度来检测角点
角点所具有的特征
轮廓之间的交点对于同一场景 即使视角发生变化 通常具备稳定性质的特征该点附近区域的像素点无论在梯度方向上还是其梯度幅值上有着较大变化
性能较好的角点
检测出图像中“真实” 的角点准确的定位性能很高的重复检测率噪声的鲁棒性较高的计算效率
下图展示了一些角点的例子
二、Harris角点检测的实现过程
计算图像在X和Y方向的梯度 计算图像两个方向梯度的乘积 使用高斯函数对三者进行高斯加权 生成矩阵M的A,B,C 计算每个像素的Harris响应值R 并对小于某一阈值 t 的R置为零;在3× 3或5× 5的邻域内进行非最大值抑制 局部最大值点即为图像中的角点
三、Harris代码应用
函数
dst cv2.cornerHarris( src, blockSize, ksize, k[, dst[, borderType]] )参数如下所示
src数据类型为 float32 的输入图像blockSize角点检测中要考虑的领域大小ksizeSobel 求导中使用的窗口大小kHarris 角点检测方程中的自由参数,取值参数为 [0,04,0.06]。
看个例子
import cv2
import numpy as np
from matplotlib import pyplot as pltimg cv2.imread(image/harris2.png)
print(img.shape)
img cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray np.float32(gray)
dst_block9_ksize19 cv2.cornerHarris(gray, 9, 19, 0.04)
img1 np.copy(img)
img1[dst_block9_ksize19 0.01 * dst_block9_ksize19.max()] [0, 0, 255]dst_block5_ksize19 cv2.cornerHarris(gray, 5, 19, 0.04)
img2 np.copy(img)
img2[dst_block5_ksize19 0.01 * dst_block5_ksize19.max()] [0, 0, 255]dst_block9_ksize5 cv2.cornerHarris(gray, 9, 5, 0.04)
img3 np.copy(img)
img3[dst_block9_ksize5 0.01 * dst_block9_ksize5.max()] [0, 0, 255]dst_block9_ksize31 cv2.cornerHarris(gray, 9, 31, 0.04)
img4 np.copy(img)
img4[dst_block9_ksize31 0.01 * dst_block9_ksize31.max()] [0, 0, 255]dst_block9_ksize19_k6 cv2.cornerHarris(gray, 9, 19, 0.06)
img5 np.copy(img)
img5[dst_block9_ksize19_k6 0.01 * dst_block9_ksize19_k6.max()] [0, 0, 255]dst_block9_ksize19_k6_1e_5 cv2.cornerHarris(gray, 9, 19, 0.06)
img6 np.copy(img)
img6[dst_block9_ksize19_k6_1e_5 0.00001 * dst_block9_ksize19_k6_1e_5.max()] [0, 0, 255]titles [Original, block9_ksize19, dst_block5_ksize19, dst_block9_ksize5, dst_block9_ksize31,dst_block9_ksize19_k6, dst_block9_ksize19_k6_1e_5]
imgs [img, img1, img2, img3, img4, img5, img6]for i in range(len(titles)):plt.subplot(3, 3, i 1), plt.imshow(imgs[i]), plt.title(titles[i])plt.xticks([]), plt.yticks([])
plt.show()
# cv2.imshow(src,img)
# cv2.imshow(dst,img5)
# cv2.waitKey(0)
# cv2.destroyAllWindows()结果如下所示 在判断出的角点处标记为蓝色上图为不同参数设置下的结果效果也是不一样的。