OpenCV与图像处理学习十三——Harris角点检测(含代码)

OpenCV与图像处理学习十三——Harris角点检测(含代码)

一、角点的概念

角点: 在现实世界中, 角点对应于物体的拐角, 道路的十字路口、 丁字路口等。

从图像分析的角度来定义角点可以有以下两种定义:

  1. 角点可以是两个边缘的交点;
  2. 角点是邻域内具有两个主方向的特征点;

角点计算方法

  1. 前者通过图像边缘计算, 计算量大, 图像局部变化会对结果产生较大的影响;
  2. 后者基于图像灰度的方法通过计算点的曲率及梯度来检测角点;

角点所具有的特征

  1. 轮廓之间的交点;
  2. 对于同一场景, 即使视角发生变化, 通常具备稳定性质的特征;
  3. 该点附近区域的像素点无论在梯度方向上还是其梯度幅值上有着较大变化

性能较好的角点

  1. 检测出图像中“真实” 的角点
  2. 准确的定位性能
  3. 很高的重复检测率
  4. 噪声的鲁棒性
  5. 较高的计算效率

下图展示了一些角点的例子:
在这里插入图片描述

二、Harris角点检测的实现过程

  1. 计算图像在X和Y方向的梯度:
    在这里插入图片描述
  2. 计算图像两个方向梯度的乘积:
    在这里插入图片描述
  3. 使用高斯函数对三者进行高斯加权, 生成矩阵M的A,B,C:
    在这里插入图片描述
  4. 计算每个像素的Harris响应值R, 并对小于某一阈值 t 的R置为零;
  5. 在3× 3或5× 5的邻域内进行非最大值抑制, 局部最大值点即为图像中的角点;

三、Harris代码应用

函数:

dst	= cv2.cornerHarris(	src, blockSize, ksize, k[, dst[, borderType]] )

参数如下所示:

  1. src:数据类型为 float32 的输入图像;
  2. blockSize:角点检测中要考虑的领域大小;
  3. ksize:Sobel 求导中使用的窗口大小;
  4. k:Harris 角点检测方程中的自由参数,取值参数为 [0,04,0.06]。

看个例子:

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

img = 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()

结果如下所示:
在这里插入图片描述
在判断出的角点处标记为蓝色,上图为不同参数设置下的结果,效果也是不一样的。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值