特征点检测器——Harris算法——兴趣点检测

1.什么是特征点1.1梯度1.2角点2.数学角度看Harris算法2.1灰度变换E2.2 灰度变换E的转换形式2.3角点响应函数2.4角点的判别3.Python代码CV复现Harris算法效果3.1 未加膨胀处理的效果3.2 加膨胀,做标记后算法效果...
摘要由CSDN通过智能技术生成

1. 算法所需的基础知识

1.什么是特征点

特征点就是角点或兴趣点,它具有旋转不变形,光照不变性,视角不变性等特性,可以在目标匹配、目标跟踪、三维重建等应用中使用

1.1梯度

梯度可以看作是变量在某方向上变换大小的参考值。因为图像中的数值是离散的,所以不能用微分,而是得用一阶差分来表示梯度。

百度百科——一阶差分

1.2角点

通俗的理解,角点就是除边缘外多线的交点。
在这里插入图片描述
角点是多种形态的,如下
在这里插入图片描述

1.3用梯度说角点

在这里插入图片描述
我们用一个模板进行全局的小幅度滑动:
1——无梯度。在这种情况下滑动,由于该区域平滑,均值不变,梯度为0
2——单个梯度值。在这种情况下滑动,由于有黑色的边缘,也就是有突变或灰度值变换较大的区域,水平方向的滑动会造成均值不同,梯度也就不为0。但是朝着垂直方向滑动,会跟情况1相同,均值没有变化。如果朝斜的方向移动,这时用行列式的思想,将居中的黑色数值所在的列移到了靠边的位置,差分值不受影响。
3——多个梯度值。在这种情况下滑动,因为水平方向和垂直方向都有突变区域,在对应的方向上滑动,就会产生梯度值。多方向有梯度值就说明有角点出现。

在第三种情况下,就会产生角点。图像四个边缘角不算角点。

2.数学角度看Harris算法

2.1灰度变换E

在这里插入图片描述
作一下说明:
1.图像灰度是指图像窗口内的灰度值,窗口一般是3邻域,5邻域大小的
2.窗口函数的作用是通过赋予邻域内不同像素值的权重来调整对识别角点的贡献。如果窗口的中心是角点,就把中心的权重加大,周围的权重调小,如此调整后,均值就会加大,梯度相应的也就变大了。

2.2 灰度变换E的转换形式

在这里插入图片描述
其中I(x)表示X轴方向的梯度方向
提取出u,v,由于移动步幅小,可得到一个近似值

在这里插入图片描述
其中M是:

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Python实现Harris点检测和特征匹配的示例代码: Harris点检测: ```python import cv2 import numpy as np # 读入图片 img = cv2.imread('test.jpg') # 转换为灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 计算Harris角点 dst = cv2.cornerHarris(gray, 2, 3, 0.04) # 归一化处理 dst_norm = np.empty(dst.shape, dtype=np.float32) cv2.normalize(dst, dst_norm, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX) # 阈值处理 threshold = 150 corners = np.argwhere(dst_norm > threshold) for pt in corners: cv2.circle(img, tuple(pt[::-1]), 3, (0, 255, 0), 2) # 显示图片 cv2.imshow('Harris corners', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 特征匹配: ```python import cv2 import numpy as np # 读入图片 img1 = cv2.imread('img1.jpg') img2 = cv2.imread('img2.jpg') # 转换为灰度图 gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) # 计算特征点和特征描述符 sift = cv2.xfeatures2d.SIFT_create() kp1, des1 = sift.detectAndCompute(gray1, None) kp2, des2 = sift.detectAndCompute(gray2, None) # 匹配特征点 bf = cv2.BFMatcher(cv2.NORM_L2, crossCheck=True) matches = bf.match(des1, des2) # 绘制匹配结果 match_img = cv2.drawMatches(img1, kp1, img2, kp2, matches[:50], None, flags=2) # 显示图片 cv2.imshow('SIFT matches', match_img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 注意:上述代码仅是示例代码,实际使用中需要根据具体情况进行调整和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值