手写Harris角点检测代码,不调用cornerHarris函数,并在角点上画圈
时间: 2024-01-22 10:20:01 浏览: 88
Harris角点检测算法的实现步骤如下:
1. 计算图像I的梯度I_x和I_y;
2. 计算每个像素点的I_x^2、I_y^2和I_x*I_y;
3. 对于图像中的每个像素点,计算其对应的Harris矩阵H;
4. 对于每个像素点,计算其Harris响应值R;
5. 设置一个阈值,筛选出Harris响应值大于该阈值的像素点;
6. 对于满足条件的像素点,在其位置上画圆。
下面是代码实现:
```python
import cv2
import numpy as np
def harris_corner_detection(image, block_size=2, ksize=3, k=0.04, threshold=0.01):
# 计算图像梯度
Ix = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=ksize)
Iy = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=ksize)
# 计算Harris矩阵的三个分量
Ix2 = np.multiply(Ix, Ix)
Iy2 = np.multiply(Iy, Iy)
Ixy = np.multiply(Ix, Iy)
# 对每个像素点计算Harris矩阵
height, width = image.shape
corner_list = []
offset = block_size // 2
for y in range(offset, height - offset):
for x in range(offset, width - offset):
Sx2 = np.sum(Ix2[y-offset:y+offset+1, x-offset:x+offset+1])
Sy2 = np.sum(Iy2[y-offset:y+offset+1, x-offset:x+offset+1])
Sxy = np.sum(Ixy[y-offset:y+offset+1, x-offset:x+offset+1])
det = Sx2*Sy2 - Sxy*Sxy
trace = Sx2 + Sy2
r = det - k * trace*trace
if r > threshold:
corner_list.append((x, y, r))
# 对角点按照响应值大小进行排序
corner_list.sort(key=lambda x: x[2], reverse=True)
# 在角点上画圆
for i in range(min(len(corner_list), 100)):
x, y, r = corner_list[i]
cv2.circle(image, (x, y), 5, (0, 255, 0), 2)
return image
if __name__ == '__main__':
image = cv2.imread('test.jpg', cv2.IMREAD_GRAYSCALE)
result = harris_corner_detection(image)
cv2.imshow('result', result)
cv2.waitKey(0)
```
其中,block_size表示计算Harris矩阵时使用的窗口大小,ksize表示Sobel算子的大小,k表示Harris算法中的参数,threshold表示筛选角点的阈值。在代码中,我们选取了响应值最大的100个角点,并在其位置上画了圆。
阅读全文