Harris角点检测python具体代码不调用用函数
时间: 2023-06-09 14:07:11 浏览: 102
以下是 Harris 角点检测的 Python 代码,不调用函数:
```
import cv2
import numpy as np
# 读入图片
img = cv2.imread('image.jpg')
# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 计算图像中每个像素的角点响应函数R
dst = cv2.cornerHarris(gray, 2, 3, 0.04)
# 反转R矩阵,以便之后更好的筛选角点
dst = cv2.dilate(dst, None)
# 设定阈值,只有大于阈值的像素点才被认为是角点
img[dst > 0.01 * dst.max()] = [0, 0, 255]
# 显示结果
cv2.imshow('Harris Corner Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
请注意,此代码仅仅是提供一个示例。如果你需要更多帮助,请查看 OpenCV 官方文档。
相关问题
harris角点检测python代码
以下是Harris角点检测的Python代码示例:
```
import cv2
import numpy as np
# 读取图像
img = cv2.imread('lena.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 计算Harris角点
dst = cv2.cornerHarris(gray, 2, 3, 0.04)
# 通过阈值筛选角点
img[dst > 0.01 * dst.max()] = [0, 0, 255]
cv2.imshow('Harris Corner Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
这段代码中,我们首先读取了一张图像,并将其转化为灰度图。接着,我们调用了OpenCV的`cv2.cornerHarris`函数来计算Harris角点。这个函数的第一个参数是输入图像,第二个参数是角点检测窗口的大小,第三个参数是Sobel算子的大小,第四个参数是Harris角点检测的自由参数。此外,我们还通过阈值筛选出了Harris角点,并将其在原图上用红色标出。最后,我们展示了标出角点的图像。
手写Harris角点检测代码,不调用cornerHarris函数,并在角点上画圈
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个角点,并在其位置上画了圆。
阅读全文