在图像处置赏罚 领域中,特征点又被称为兴趣点或者角点,它通常具有旋转稳固 性和光照稳固 性和视角稳固 性等优点,是图像的主要 特征之一,常被应用到目的 匹配、目的 跟踪、三维重修 等应用中。点特征主要指图像中的显着 点,如突出的角点、边缘端点、极值点等等,用于点特征提取的算子称为兴趣点提取(检测)算子,常用的有Harris角点检测、FAST特征检测、SIFT特征检测及SURF特征检测。
本次博客较为常用而且较为基础的Harris角点检测算法,它的头脑 以及数学理论能够很好地资助我们相识 兴趣点检测的相关原理。
1.2内容先容 1.2.1基础知识1.角点 使用一个滑动窗口在下面三幅图中滑动,可以得出以下结论:
左图体现一个平展 区域,在各偏向移动,窗口内像素值均没有太大转变 ;中图体现一个边缘特征(Edges),若是 沿着水平偏向移动(梯度偏向),像素值会发生跳变;若是 沿着边缘移动(平行于边缘) ,像素值不会发生转变 ;右图体现一个角(Corners),不管你把它朝哪个偏向移动,像素值都市发生很大转变 。
以是 ,右图是一个角点。
2.角点类型 下图展示了差异角点的类型,可以发现:若是 使用一个滑动窗口以角点为中央 在图像上滑动,存在朝多个偏向上的移动会引起该区域的像素值发生很大转变 的征象 。

在这里插入图片形貌
3.图像梯度
图像的梯度与数学中的梯度在形式上是由差异的,缘故原由 在于图像的特点,图像是一个离散的二维函数,接下来会实验说明这一点,但从意义上来说是相同的,是为了体现图像灰度的转变 率。在数学微积分中,一维函数的一阶微分的基本界说是:二维函数的一阶微分的基本界说是:
对于灰度图这样二维数组的图像,它着实 就是一个离散的二位函数,说它离散,是由于 每个灰度值取值为整数而不是小数,因此ϵ不能无限小,而ϵ的最小单元即是1像素。因此当ϵ取最小值1时,灰度图(离散的二维函数)的一阶微分基本界说是:
我们可以视察到,图像在(x, y)点处x偏向和y偏向上的梯度相当于2个相邻像素之间的差值。而且一样平常 地,我们会使用两个偏向上梯度的绝对值,由于 我们只体贴图像的灰度值转变 巨细,而梯度偏向只需要知道是水平照旧垂直即可,无须知晓到底是详细 是向左照旧向右,向下照旧向上。
盘算图像某点的梯度。 上面,我们先容 了图像某个点的水平梯度gx和垂直梯度gy的盘算方式,而将两者团结 起来即可获得图像中该点的梯度的巨细与偏向。 a. 盘算梯度的巨细,在数学上,这种团结 的公式是:可是 图像处置赏罚 中经常使用以下方式(用绝对值加和来近似平方清静 方根)来减小盘算开支。
再进一步扩展,图像的梯度也常用来判断某个窗口区域是平展 、边缘照旧角点。而在边缘检测中,图像某一点的梯度偏向是与边缘偏向相垂直的,以是 知道了梯度的偏向,就晓得了边缘的偏向,在以后的边缘检测、轮廓检测等知识中会用到。 尚有 ,希望各人记着梯度的盘算是以每一个像素点为中央 ,而非一个区域(好比 3×3)。
“像素值发生很大转变 ”这一征象 可以用图像梯度举行 形貌 。在图像局部内,图像梯度越概略现该局部内像素值转变 越大(灰度的转变 率越大)。 而图像的梯度在数学上可用微分或者导数来体现。对于数字图像来说,相当于是二维离散函数求梯度,并使用差分来近似导数: 在现实 操作中,对图像求梯度通常是思量 图像的每个像素的某个邻域内的灰度转变 ,因此通常对原始图像中像素某个邻域设置梯度算子,然后接纳小区域模板举行 卷积来盘算,常用的有Prewitt算子、Sobel算子、Robinson算子、Laplace算子等。
1.2.2 Sobel算子简介sobel算子用来检测主体与主体之间的边缘特征,其效果有点类似高斯滤波,能够使得离中央 点越近的像素权重越大,越主要 。需要诠释 的是,我们适才先容 了,图像在某一点A的梯度,只需要盘算其相邻两个像素点的差值即可获得X偏向Y偏向上的梯度; 但为了越发合理的判断某一点的梯度巨细,需要借助算子为这个以点A为中央 的ksize×ksize区域(一样平常 是ksize取3或5或者其他奇数)添加权重,来扩大差异,增强边缘检测效果。 而且在运用中,由于 盘算一点的梯度需要借助周边区域的多个点的灰度值,因而对图像中的噪点较量 敏感,因此时常在挪用 sobel要领举行 盘算之前,需要先借助高斯滤波器或者其他滤波器对原图像举行 平滑\模糊处置赏罚 以降噪。 以是 完整的Sobel梯度盘算历程是:1.高斯滤波器对原图像平滑降噪GaussianBlur 2.转灰度图cvtColor3.求X和Y偏向的梯度Sobel。sobel算子的形式在OpenCV - Python 中,挪用 cv2.Sobel要领,一样平常 的sobel算子是,右减左,下减上,进而获得图像中某一点的x偏向上的梯度或者y偏向上的梯度。另外,由于 举行 减法操作后纷歧定获得的是正值,也可能是负值,可是 uint8不允许负值的存在,因此要指定ddepth = cv2.CV_64F 以包容负值的存在(eg:cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)),此时举行 图像的展示,会先将数组中的负值视为0。可是 随后会挪用 其他要领(cv2.convertScaleAbs)以举行 绝对值化的操作,此时举行 展示时,会使得负值转化为正值,获得我们完整的特征图。sobel算子的盘算梯度的数学盘算类似于卷积神经网络的卷积盘算,而详细 的盘算历程参考sobel算子原理与实现.在此需要注重 ,sobel算子是算梯度的,虽然盘算涉及许多的像素点,可是 它盘算的效果 是一个值,是盘算区域中央 坐标的梯度值!sobel算子的盘算梯度时,对于边缘点的梯度,一样平常 会做填充处置赏罚 ,即若是 算子核巨细为3的话,会在图像四界线 填充一层像素值为0的点。不明之处:我们这篇文章着实 是妄想 讲CornerHarris的参数的。而sobel算子是Harris角点检测历程中使用的算子,可是 CornerHarris的参数中似乎只能指定sobel算子的巨细即ksize,而不能指定详细 使用的核是啥,而这一点有待深挖,由于 我也看到过自界说算子,好比,高斯滤波器曾作为图像降噪的方式,也可用来盘算梯度并赋予到某些要领(eg.erode)中的情形 。1.2.3滤波器主要想推荐一篇文章图像平滑去噪之高斯滤波器。详细 的滤波器内容内容较量 普遍 ,读者自行学习。高斯滤波器的形式。由于高斯滤波实质是一种加权平均滤波,为了实现平均,核还带有一个系数,例如上图中的十六分之一、八十四分之一。这些系数即是矩阵中所有数值之和的倒数。相比之下,sobel算子的核在盘算时,只是简朴的加权求和。高斯滤波的特点。由于 高斯滤波是以空间距离来确定权重巨细的,但并没有思量 用颜色距离来确定权重,这样就导致了高斯滤波在去除噪声的同时,也一定水平上模糊了界线 。1.2.4 Harris角点检测算法原理1. 算法头脑 算法的焦点是使用 局部窗口在图像上举行 移动,判断灰度是否发生较大的转变 。若是 窗口内的灰度值(在梯度图上)都有较大的转变 ,那么这个窗口所在区域就存在角点。
这样就可以将 Harris 角点检测算法分为以下三步:
当窗口(局部区域)同时向 x (水平)和 y(垂直) 两个偏向移动时,盘算窗口内部的像素值转变 量 ;对于每个窗口,都盘算其对应的一个角点响应函数 ;然后对该函数举行 阈值处置赏罚 ,若是 ,体现该窗口对应一个角点特征。2. 第一步 — 建设数学模子
第一步是通过建设数学模子 ,确定哪些窗口会引起较大的灰度值转变 。 让一个窗口的中央 位于灰度图像的一个位置,这个位置的像素灰度值为 ,若是 这个窗口划分向 和 偏向移动一个小的位移和,到一个新的位置 ,这个位置的像素灰度值就是
就是窗口移动引起的灰度值的转变 值。
设为位置处的窗口函数,体现窗口内各像素的权重,最简朴的就是把窗口内所有像素的权重都设为1,即一个均值滤波核。
虽然,也可以把 设定为以窗口中央 为原点的高斯漫衍,即一个高斯核。若是 窗口中央 点像素是角点,那么窗口移动前后,中央 点的灰度值转变 很是强烈,以是 该点权重系数应该设大一点,体现该点对灰度转变 的孝顺 较大;而离窗口中央 (角点)较远的点,这些点的灰度转变 较量 小,于是将权重系数设小一点,体现该点对灰度转变 的孝顺 较小。
则窗口在各个偏向上移动 所造成的像素灰度值的转变 量公式如下:

若窗口内是一个角点,则的盘算效果 将会很大。
为了提高盘算效率,对上述公式举行 简化,使用 泰勒级数睁开 来获得这个公式的近似形式:
对于二维的泰勒睁开 式公式为:
则 为:
其中和是的微分(偏导),在图像中就是求 和 偏向的梯度图:
将代入,可得:
提出 u 和 v ,获得最终二次型的近似形式:
其中矩阵M为:
最后是把实对称矩阵对角化处置赏罚 后的效果 ,可以把R看成旋转因子,其不影响两个正交偏向的转变 分量。
(接下来的一小段内容是说:该自相似函数可以视为一个椭圆,而椭圆的形状与特征值的巨细相关) 而对于 若是 把c视为一个常数, 那么这就是一个二次 型方程,而二次型方程在二维图像中就是一个杨圆。而常数的详细 取值并不影响梅圆的形状。而梅圆 的形状又恰恰 是我们要重点研究的,**准确的说是它的是非轴与我们想要求得特征值亲近 相关。**因 此在此我们暂时 将该二次型方程视为:

图来自二次型的意义是什么?有什么应用? - 马同砚 的回覆 - 知乎 很是赞的回覆!推荐阅读。
(接下里这段是说,求特征值为什么借助矩阵,且特征值的意义是什么)
首先,求特征值为什么借助矩阵,这个问题我不应问的,由于 求特征值自己就需要借助矩阵运算。 其次,特征值或者确切说特征矩阵意味着什么?首先,矩阵代表着运动,且当矩阵维度没有发生改变时,一个矩阵就包罗了两个运动:旋转和拉伸。而若是 想把这两个运动剖析,可以对矩阵举行 正交化操作和特征值剖析,由此获得两个矩阵正交矩阵和对角矩阵。

在这里插入图片形貌
而正交矩阵就单纯的意味着旋转运动,而对角矩阵就单纯地意味着左右上下拉伸运动。

而对于一个二次方程的二次型矩阵即M(x,y)替换 成它对应的对角矩阵,则一个倾斜的椭圆就扶正了。 团结 下图举行 明确 上一段话,若是 没能明确 ,那一定不是你的缘故原由 ,一定是我没说清晰 ,详细 可以参考文章:二次型的意义是什么?有什么应用? - 马同砚 的回覆 - 知乎 。

经对角化处置赏罚 后,将两个正交偏向的转变 分量提取出来,就是 λ1 和 λ2(特征值)。 这里使用 了线性代数中的实对称矩阵对角化的相关知识,有兴趣的同砚 可以进一步查阅相关资料。
3. 第二步—角点响应函数R 现在我们已经获得 的最终形式,别忘了我们的目的是要找到会引起较大的灰度值转变 的那些窗口。
灰度值转变 的巨细则取决于矩阵M,M为梯度的协方差矩阵。在现实 应用中为了能够应用更好的编程,以是 界说了角点响应函数R,通过判断 R巨细来判断像素是否为角点。
盘算每个窗口对应的得分(角点响应函数R界说):
其中 是矩阵的行列式, 是矩阵的迹。
λ 和 λ 是矩阵的特征值, 是一个履历 常数,在规模 (0.04, 0.06) 之间。
的值取决于的特征值,对于角点很大,平展 的区域很小,边缘的为负值。
4. 第三步—角点判断 凭证 R 的值,将这个窗口所在的区域划分为平面、边缘或角点。为了获得最优的角点,我们还可以使用非极大值抑制。
注重 :Harris 检测用具 有旋转稳固 性,但不具有尺度稳固 性,也就是说尺度转变 可能会导致角点变为边缘。想要尺度稳固 特征 的话,可以关注SIFT特征。
由于 特征值 λ1 和 λ2 决议 了 R 的值,以是 我们可以用特征值来决议 一个窗口是平面、边缘照旧角点:
平面::该窗口在平展 区域上滑动,窗口内的灰度值基本不会发生转变 ,以是 值很是小,在水平和竖直偏向的转变 量均较小,即 和 都较小,那么 λ1 和 λ2 都较小;
边缘:值为负数,仅在水平或竖直偏向有较大的转变 量,即 和 只有一个较大,也就是 λ1λ2 或 λ2λ1;
角点: 值很大,在水平、竖直两个偏向上转变 均较大的点,即 和 都较大,也就是 λ1 和 λ2 都很大。
如下图所示:

Harris 角点检测的效果 是带有这些分数 R 的灰度图像,设定一个阈值,分数大于这个阈值的像素就对应角点。
1.3 基于OpenCV的实现1. API 在opencv中有提供实现 Harris 角点检测的函数 cv2.cornerHarris,我们直接挪用 的就可以,很是利便 。
函数原型:cv2.cornerHarris(src, blockSize, ksize, k[, dst[, borderType]])
对于每一个像素 (x,y),在 (blockSize x blockSize) 邻域内,盘算梯度图的协方差矩阵 ,然后通过上面第二步中的角点响应函数获得效果 图。图像中的角点可以为该效果 图的局部最大值。
即可以获得输出图中的局部最大值,这些值就对应图像中的角点。
参数诠释 :
src - 输入灰度图像,float32类型blockSize - 用于角点检测的邻域巨细,就是上面提到的窗口的尺寸ksize - 用于盘算梯度图的Sobel算子的尺寸k - 用于盘算角点响应函数的参数k,取值规模常在0.04~0.06之间importcv2ascvfrommatplotlibimportpyplotaspltimportnumpyasnp#detectorparametersblock_size=3sobel_size=3k=0.06image=cv.imread('E:/python-project/deep-learning/picture/test1.jpg')print(image.shape)height=image.shape[0]width=image.shape[1]channels=image.shape[2]print("width:%sheight:%schannels:%s"%(width,height,channels))gray_img=cv.cvtColor(image,cv.COLOR_BGR2GRAY)#modifythedatatypesettingto32-bitfloatingpointgray_img=np.float32(gray_img)#detectthecornerswithappropriatevaluesasinputparameterscorners_img=cv.cornerHarris(gray_img,block_size,sobel_size,k)#resultisdilatedformarkingthecorners,notnecessarykernel=cv.getStructuringElement(cv.MORPH_RECT,(3,3))dst=cv.dilate(corners_img,kernel)#Thresholdforanoptimalvalue,markingthecornersinGreen#image[corners_img0.01*corners_img.max()]=[0,0,255]forrinrange(height):forcinrange(width):pix=dst[r,c]ifpix0.05*dst.max():cv2.circle(image,(c,r),5,(0,0,255),0)image=cv.cvtColor(image,cv.COLOR_BGR2RGB)plt.imshow(image)plt.show()效果 :
1.3 总结Harris角点检测的性子 可总结如下:
阈值决议 角点的数目 Harris角点检测算子对亮度和对比度的转变 不敏感(光照稳固 性) 在举行 Harris角点检测时,使用了微分算子对图像举行 微分运算,而微分运算对图像密度的拉升或缩短 和对亮度的抬高或下降不敏感。换言之,对亮度和对比度的仿射变换并不改变Harris响应的极值点泛起的位置,可是 ,由于阈值的选择,可能会影响角点检测的数目 。Harris角点检测算子具有旋转稳固 性 Harris角点检测算子使用的是角点周围 的区域灰度二阶矩矩阵。而二阶矩矩阵可以体现成一个椭圆,椭圆的是非轴正是二阶矩矩阵特征值平方根的倒数。当特征椭圆转动时,特征值并不发生转变 ,以是 判断角点响应值也不发生转变 ,由此说明Harris角点检测算子具有旋转稳固 性。Harris角点检测算子不具有尺度稳固 性 尺度的转变 会将角点变为边缘,或者边缘变为角点,Harris的理论基础并不具有尺度稳固 性。
论文:《C.Harris, M.Stephens. “A Combined Corner and Edge Detector”. Proc. of 4th Alvey Vision Conference》