Harris角点检测代码编写,要求返回角点坐标,不调库
时间: 2024-05-11 12:15:51 浏览: 116
Harris角点检测_harris_角点检测_源码
第一个问题的回答:
Harris角点检测是通过计算局部灰度变化来检测图像中的角点,一般可以通过以下步骤来编写角点检测算法:
1. 对图像进行灰度化处理,将彩色图像转换为灰度图像;
2. 对图像进行高斯滤波,减少图像噪声;
3. 计算Sobel算子,求取图像在x和y方向上的梯度;
4. 计算每个像素点的M矩阵;
5. 根据M矩阵的响应函数计算每个像素点的角点响应值;
6. 对角点响应值进行非极大值抑制,得到所有的角点;
7. 根据设定的阈值,筛选出最终的角点,并返回角点的坐标。
下面是一个简单的Harris角点检测的代码实现,仅供参考:
```python
import cv2
import numpy as np
def harris_corner_detection(image, ksize=3, k=0.04, threshold=0.01):
# 1. 灰度化处理
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 2. 高斯滤波
gray = cv2.GaussianBlur(gray, (ksize, ksize), 0)
# 3. 求取x和y方向上的梯度
dx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=ksize)
dy = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=ksize)
# 4. 计算M矩阵
Ix2 = dx ** 2
Iy2 = dy ** 2
Ixy = dx * dy
M11 = cv2.GaussianBlur(Ix2, (ksize, ksize), 0)
M22 = cv2.GaussianBlur(Iy2, (ksize, ksize), 0)
M12 = cv2.GaussianBlur(Ixy, (ksize, ksize), 0)
# 5. 计算角点响应值
det_M = M11 * M22 - M12 ** 2
trace_M = M11 + M22
harris_response = det_M - k * trace_M ** 2
# 6. 非极大值抑制,获得所有角点
harris_response_max = cv2.dilate(harris_response, None)
harris_corners = np.zeros_like(harris_response)
harris_corners[harris_response > threshold * harris_response_max] = 255
harris_corners = np.uint8(harris_corners)
# 7. 获取角点坐标
corners = cv2.goodFeaturesToTrack(gray, 100, 0.01, 10, mask=harris_corners)
corners = np.int0(corners)
corners = [tuple(c[0]) for c in corners]
return corners
```
这段代码实现了基本的Harris角点检测算法,输入一个彩色图像,输出它的所有角点坐标。但需要注意的是,Harris角点检测算法对于光照变化敏感,需要进行图像预处理,以及对阈值进行适当调整。
阅读全文