美文网首页
Harris特征点检测器-兴趣点检测

Harris特征点检测器-兴趣点检测

作者: 不跳不蚤 | 来源:发表于2020-06-24 23:03 被阅读0次

    1. 简介

        图形图像领域将特征点称为兴趣点或者角点,这些点通常具有选择不变性、光照不变性和视角不变性。Harris是角点检测的一种检测方法。

    2. 角点

    角点分析图

            如上图最左侧,蓝色的窗口在附近移动时,所包含的像素值并不会发生太大的变化,所以左图表示一个平坦区域。中间的这张图,沿水平方向移动,像素会发生很大变化(跳变),但在垂直方向移动,不会产生变化,所以它表示边缘特征。而又图,无论哪个方向移动,像素值都会发生很大变化,所以右图表示一个角点。

    角点类型

    3. 图像梯度

            “像素值发生很大变化”这一现象采用图像梯度来描述。在图像局部内,图像梯度越大表示该局部内像素值变化越大(灰度的变化率越大)。

            图像的梯度可以用微分或者导数的方式来表示。对于数字图像相当于使用二维离散函数求梯度,并使用差分近似求导:

    Gx(x,y)=H(x+1,y)-H(x-1,y)

    Gy(x,y)=H(x,y+1)-H(x,y-1)

            实际操作时,求梯度通常是求某个像素的某个邻域内的灰度变化。因此常对原始图像的某个邻域设置梯度算子,然后采用小区域模版进行卷积来计算。

    4. Harris角点算法检测原理

            算法核心思想是利用局部窗口在图像上移动,判断灰度值是否发生较大变化,如果发生了较大变化,那么就存在角点。

            1. 窗口在x,y两个方向移动,并计算出窗口内像素的变化量E(x,y),

            2. 对于每一个窗口,计算其对应的角点响应函数R,

            3. 对该函数做阈值处理,如果 R>threshold,表示该窗口对应一个角点特征。

    该算法的实现:

            1.建立数学模型:通过建立数学模型来确定哪些窗口会引起较大的灰度值变化。

                    设窗口中心位于灰度图的(x,y)点,这个位置的灰度值为 I(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)处的窗口函数,表示窗口内各像素的权重。W(x,y)可设为1,也可设为正态分布函数。

                    窗口函数的(u,v)移动产生的灰度值变化公式为:

    图像窗口移动灰度值变化公式 泰勒公式转化E(u,v) 提出u,v得出近似形式 近似形式的矩阵M

                        对角化处理后,提出特征值\lambda 1 \lambda 2

                2. 角点响应函数R

            灰度值变化的大小取决于矩阵M,M为梯度的协方差矩阵。为了方便应用和编程,定义了角点响应函数R,通过R的大小来判断是否是角点。

    角点响应函数R

            det(M)=\lambda 1\lambda 2是矩阵行列式,trace(M)=\lambda 1+\lambda 2是矩阵的迹。k是经验常数,一般0.04<k<0.06。R的值取决于M的特征值,角点的R很大,平坦区域R很小,边缘的R为负值。

                3. 角点判定

            角点:R很大,\lambda 1\lambda 2都很大。

            边缘:R为负值,\lambda 1>>\lambda 2 或 \lambda 2>>\lambda 1

            平坦:  R很小,\lambda 1\lambda 2都很小。

    角点判定图

    5. OpenCV的实现

        OpenCV中有提供角点检测函数cv2.cornerHarris( src, blockSize, ksize, k [, dst[, borderType]])。

            1. src输入灰度图,float32类型,

            2. blockSize 窗口的尺寸

            3. ksize用于计算梯度图的Sobel算子的尺寸

            4. k 响应函数的k值,0.04~0.06之间

    代码:


    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()


    6. 测试结果

    正常图检测 旋转图检测

    相关文章

      网友评论

          本文标题:Harris特征点检测器-兴趣点检测

          本文链接:https://www.haomeiwen.com/subject/skmdfktx.html