Harris角点检测的思想是通过图像的局部的小窗口观察图像,角点的特征是窗口沿任意方向移动都会导致图像灰度的明显变化,如下图所示:
.判断角点,如下图所示:
- 当R为大数值的正数时是角点
- 当R为大数值的负数时是边界
- 当R为小数是认为是平坦区域
dst=cv.cornerHarris(src, blockSize, ksize, k)
- img:数据类型为 float32 的输入图像。
- blockSize:角点检测中要考虑的邻域大小。
- ksize:sobel求导使用的核大小
- k :角点检测方程中的自由参数,取值参数为 [0.04,0.06].
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
# 1 读取图像,并转换成灰度图像
img = cv.imread('./1.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 2 角点检测
# 2.1 输入图像必须是 float32
gray = np.float32(gray)
# 2.2 最后一个参数在 0.04 到 0.05 之间
dst = cv.cornerHarris(gray, 2, 3, 0.04)
# 3 设置阈值,将角点绘制出来,阈值根据图像进行选择
img[dst > 0.001 * dst.max()] = [0, 0, 255]
# 4 图像显示
plt.figure(figsize=(10, 8), dpi=100)
plt.imshow(img[:, :, ::-1]),
plt.title('Harris角点检测')
plt.xticks([]),
plt.yticks([])
plt.show()
原图:
Harris角点检测的优缺点:
优点:
- 旋转不变性,椭圆转过一定角度但是其形状保持不变(特征值保持不变)
- 对于图像灰度的仿射变化具有部分的不变性,由于仅仅使用了图像的一介导数,对于图像灰度平移变化不变;对于图像灰度尺度变化不变
缺点:
- 对尺度很敏感,不具备几何尺度不变性。
- 提取的角点是像素级的