更新时间:2021年06月03日17时50分 来源:传智教育 浏览次数:
Harris角点检测的思想是通过图像的局部的小窗口观察图像,角点的特征是窗口沿任意方向移动都会导致图像灰度的明显变化,如下图所示:
将上述思想转换为数学形式,即将局部窗口向各个方向移动并计算所有灰度差异的总和,表达式如下:
其中是局部窗口的图像灰度,是平移后的图像灰度,是窗口函数,该可以是矩形窗口,也可以是对每一个像素赋予不同权重的高斯窗口,如下所示:
角点检测中使的值最大。利用一阶泰勒展开有:
其中和 是沿x和y方向的导数,可用sobel算子计算。
推导如下:
矩阵决定了的取值,下面我们利用来求角点,是和的二次项函数,可以表示成椭圆的形状,椭圆的长短半轴由的特征值和决定,方向由特征矢量决定,如下图所示:
椭圆函数特征值与图像中的角点、直线(边缘)和平面之间的关系如下图所示。
共可分为三种情况:
Harris给出的角点计算方法并不需要计算具体的特征值,而是计算一个角点响应值来判断角点。的计算公式为:
式中,detM为矩阵M的行列式;traceM为矩阵M的迹;α为常数,取值范围为0.04~0.06。事实上,特征是隐含在detM和traceM中,因为:
那我们怎么判断角点呢?如下图所示:
在OpenCV中实现Hariis检测使用的API是:
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('./image/chessboard.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角点检测的优缺点:
优点:
缺点: