标签:kernel blocks lap 根据 tin amp har parameter 旋转
使用一个滑动窗口在下面三幅图中滑动,可以得出以下结论:
下图展示了不同角点的类型,可以发现:如果使用一个滑动窗口以角点为中心在图像上滑动,存在朝多个方向上的移动会引起该区域的像素值发生很大变化的现象。
“像素值发生很大变化”这一现象可以用图像梯度进行描述。在图像局部内,图像梯度越大表示该局部内像素值变化越大(灰度的变化率越大)。 而图像的梯度在数学上可用微分或者导数来表示。对于数字图像来说,相当于是二维离散函数求梯度,并使用差分来近似导数:
\[G_x(x,y)=H(x+1,y)?H(x?1,y)\G_y(x,y)=H(x,y+1)?H(x,y?1)\]
在实际操作中,对图像求梯度通常是考虑图像的每个像素的某个邻域内的灰度变化,因此通常对原始图像中像素某个邻域设置梯度算子,然后采用小区域模板进行卷积来计算,常用的有Prewitt算子、Sobel算子、Robinson算子、Laplace算子等。
算法的核心是利用局部窗口在图像上进行移动,判断灰度是否发生较大的变化。如果窗口内的灰度值(在梯度图上)都有较大的变化,那么这个窗口所在区域就存在角点。
这样就可以将\(Harris\)角点检测算法分为以下三步:
第一步是通过建立数学模型,确定哪些窗口会引起较大的灰度值变化。让一个窗口的中心位于灰度图像的一个位置\((x,y)\),这个位置的像素灰度值为\(I(x,y)\),如果这个窗口分别向\(x\)和\(y\)方向移动一个小的位移\(u\)和\(v\),到一个新的位置 \((x+u,y+v)\),这个位置的像素灰度值就是\(I(x+u,y+v)\)。
\(|I(x+u,y+v)?I(x,y)|\)就是窗口移动引起的灰度值的变化值。
设w(x,y)为位置(x,y)处的窗口函数,表示窗口内各像素的权重,最简单的就是把窗口内所有像素的权重都设为1,即一个均值滤波核。
当然,也可以把\(w(x,y)\)设定为以窗口中心为原点的高斯分布,即一个高斯核。如果窗口中心点像素是角点,那么窗口移动前后,中心点的灰度值变化非常强烈,所以该点权重系数应该设大一点,表示该点对灰度变化的贡献较大;而离窗口中心(角点)较远的点,这些点的灰度变化比较小,于是将权重系数设小一点,表示该点对灰度变化的贡献较小。
则窗口在各个方向上移动\((u,v)\)所造成的像素灰度值的变化量公式如下:
若窗口内是一个角点,则\(E(u,v)\)的计算结果将会很大。
为了提高计算效率,对上述公式进行简化,利用泰勒级数展开来得到这个公式的近似形式:
对于二维的泰勒展开式公式为:
\(T(x,y)=f(u,v)+(x?u)f_x(u,v)+(y?v)f_y(u,v)+...\)
则\(I(x+u,y+v)\)为:
\(I(x+u,y+v)=I(x,y)+uI_x+vI_y\)
其中\(I_x\)和\(I_y\)是\(I\)的微分(偏导),在图像中就是求\(x\)和\(y\)方向的梯度图:
\[I_x=\frac{?I(x,y)}{?x}\I_y=\frac{?I(x,y)}{?y}\]
将\(I(x+u,y+v)=I(x,y)+uI_x+vI_y\)代入\(E(u,v)\)可得:
\[\begin{aligned} E(u,v)&=\sum\limits_{(x,y)}w(x,y)\times{[I(x,y)+uI_x+vI_y-I(x,y)]}^{2}\&=\sum\limits_{(x,y)}w(x,y)\times{(uI_x+vI_y)}^{2}\&=\sum\limits_{(x,y)}w(x,y)\times{({u}^{2}{I_x}^{2}+{v}^{2}{I_y}^{2}+2uvI_xI_y)} \end{aligned} \]
提出\(u\)和\(v\),得到最终的近似形式:
\(E(u,v)\approx[u,v]M\begin{bmatrix}u\\v\end{bmatrix}\)
其中矩阵M为:
\(M=\sum\limits_{x,y}w(x,y)\begin{bmatrix} {I_x}^{2}&I_xI_y\I_xI_y&{I_y}^{2}\end{bmatrix}\longrightarrow{R}^{-1}\begin{bmatrix} {\lambda}_1&0\0&{\lambda}_2\end{bmatrix}R\)
最后是把实对称矩阵对角化处理后的结果,可以把R看成旋转因子,其不影响两个正交方向的变化分量。
经对角化处理后,将两个正交方向的变化分量提取出来,就是 λ1 和 λ2(特征值)。 这里利用了线性代数中的实对称矩阵对角化的相关知识,有兴趣的同学可以进一步查阅相关资料。
现在我们已经得到\(E(u,v)\)的最终形式,别忘了我们的目的是要找到会引起较大的灰度值变化的那些窗口。
灰度值变化的大小则取决于矩阵M,M为梯度的协方差矩阵。在实际应用中为了能够应用更好的编程,所以定义了角点响应函数R,通过判定R大小来判断像素是否为角点。
计算每个窗口对应的得分(角点响应函数R定义):
\(R=det(M)-k{(trace(M))}^{2}\)
其中\(det(M)=\lambda_1\lambda_2\)是矩阵的行列式,\(trace(M)=λ_1+λ_2\)是矩阵的迹。
\(λ_1\)和\(λ_2\)是矩阵M的特征值, \(k\)是一个经验常数,在范围 (0.04, 0.06) 之间。
\(R\)的值取决于M的特征值,对于角点\(|R|\)很大,平坦的区域\(|R|\)很小,边缘的\(R\)为负值。
根据 R 的值,将这个窗口所在的区域划分为平面、边缘或角点。为了得到最优的角点,我们还可以使用非极大值抑制。
注意:Harris 检测器具有旋转不变性,但不具有尺度不变性,也就是说尺度变化可能会导致角点变为边缘。想要尺度不变特性的话,可以关注SIFT特征。
因为特征值\(λ_1\)和\(λ_2\)决定了\(R\)的值,所以我们可以用特征值来决定一个窗口是平面、边缘还是角点:
如下图所示:
\(Harris\)角点检测的结果是带有这些分数\(R\)的灰度图像,设定一个阈值,分数大于这个阈值的像素就对应角点。
在opencv中有提供实现 Harris 角点检测的函数 cv2.cornerHarris,我们直接调用的就可以,非常方便。
函数原型:
cv2.cornerHarris(src, blockSize, ksize, k[, dst[, borderType]])
对于每一个像素\((x,y)\),在\((blockSize \times blockSize)\)邻域内,计算梯度图的协方差矩阵\(M(x,y)\),然后通过上面第二步中的角点响应函数得到结果图。图像中的角点可以为该结果图的局部最大值。
即可以得到输出图中的局部最大值,这些值就对应图像中的角点。
参数解释:
代码示例
import cv2 as cv
from matplotlib import pyplot as plt
import numpy as np
# detector parameters
block_size = 3
sobel_size = 3
k = 0.06
image = cv.imread(‘Scenery.jpg‘)
print(image.shape)
height = image.shape[0]
width = image.shape[1]
channels = image.shape[2]
print("width: %s height: %s channels: %s"%(width, height, channels))
gray_img = cv.cvtColor(image, cv2.COLOR_BGR2GRAY)
# modify the data type setting to 32-bit floating point
gray_img = np.float32(gray_img)
# detect the corners with appropriate values as input parameters
corners_img = cv.cornerHarris(gray_img, block_size, sobel_size, k)
# result is dilated for marking the corners, not necessary
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 3))
dst = cv.dilate(corners_img, kernel)
# Threshold for an optimal value, marking the corners in Green
#image[corners_img>0.01*corners_img.max()] = [0,0,255]
for r in range(height):
for c in range(width):
pix=dst[r,c]
if pix>0.05*dst.max():
cv2.circle(image,(c,r),5,(0,0,255),0)
image = cv.cvtColor(image, cv2.COLOR_BGR2RGB)
plt.imshow(image)
plt.show()
结果
本小节对Harris角点检测算法进行了学习。通过这次学习我们了解了角点的概念、图像梯度等基本知识,也认识了基本的角点检测算法思想。
Harris角点检测的性质可总结如下:
标签:kernel blocks lap 根据 tin amp har parameter 旋转
原文地址:https://www.cnblogs.com/hehuaizhou/p/13170189.html