Datawhale 计算机视觉基础-图像处理(下)-Task01 Harris

1.Harris角点

1.1基本原理

人眼对角点的识别通常是在一个局部的小区域或小窗口完成的。如果在各个方向上移动这个特征的小窗口,窗口内区域的灰度发生了较大的变化,那么就认为在窗口内遇到了角点。如果这个特定的窗口在图像各个方向上移动时,窗口内图像的灰度没有发生变化,那么窗口内就不存在角点;如果窗口在某一个方向移动时,窗口内图像的灰度发生了较大的变化,而在另一些方向上没有发生变化,那么,窗口内的图像可能就是一条直线的线段。


图片.png

对于图像I(x,y),当在点(x,y)处平移(Δx,Δy)后的自相似性,可以通过自相关函数给出:


图片.png

其中,W(x,y)是以点(x,y)为中心的窗口,w(u,v)为加权函数,它既可是常数,也可以是高斯加权函数。
图片.png

根据泰勒展开,对图像I(x,y)在平移(Δx,Δy)后进行一阶近似:


图片.png

其中,Ix,Iy是图像I(x,y)的偏导数,这样的话,自相关函数则可以简化为:
图片.png

其中
图片.png

也就是说图像I(x,y)在点(x,y)处平移(Δx,Δy)后的自相关函数可以近似为二项函数:
图片.png

其中
图片.png

二次项函数本质上就是一个椭圆函数。椭圆的扁率和尺寸是由M(x,y)的特征值λ1、λ2决定的,椭贺的方向是由M(x,y)的特征矢量决定的,如下图所示,椭圆方程为:


图片.png

椭圆函数特征值与图像中的角点、直线(边缘)和平面之间的关系如下图所示。共可分为三种情况:

图像中的直线。一个特征值大,另一个特征值小,λ1≫λ2或λ2≫λ1。自相关函数值在某一方向上大,在其他方向上小。
图像中的平面。两个特征值都小,且近似相等;自相关函数数值在各个方向上都小。
图像中的角点。两个特征值都大,且近似相等,自相关函数在所有方向都增大。


图片.png

根据二次项函数特征值的计算公式,我们可以求M(x,y)矩阵的特征值。但是Harris给出的角点差别方法并不需要计算具体的特征值,而是计算一个角点响应值R来判断角点。R的计算公式为:


图片.png

式中,detM为矩阵M=[A B
B C]的行列式;traceM为矩阵M的直迹;α为经常常数,取值范围为0.04~0.06。事实上,特征是隐含在detM和traceM中,因为,
图片.png

2. Harris角点算法实现

根据上述讨论,可以将Harris图像角点检测算法归纳如下,共分以下五步:

  1. 计算图像I(x,y)在X和Y两个方向的梯度Ix、Iy。


    图片.png

    2.计算图像两个方向梯度的乘积。


    图片.png

    3.使用高斯函数对I2x、I2y和Ixy进行高斯加权(取σ=1),生成矩阵M的元素A、B和C。
    图片.png
  2. 计算每个像素的Harris响应值R,并对小于某一阈值t的R置为零。


    图片.png
  3. 在3×3或5×5的邻域内进行非最大值抑制,局部最大值点即为图像中的角点。
    Harris角点检测源码python版本的实现:
import cv2
import numpy as np

def detectHarrisCorners(imgSrc,imgDst):
    if imgSrc is None:
    print ("imgSrc is empty")
    #imgDst = imgSrc
    if(imgSrc.shape[-1] == 3):
        grayImg = cv2.cvtColor(imgSrc,cv2.COLOR_BGR2GRAY)
    else:
        grayImg = imgSrc

    grayImg_h = int(grayImg.shape[0])
    grayImg_w = int(grayImg.shape[1])

    ykernel = np.array(([-1],[0],[1]),dtype = "float32")
    xkernel = np.array(([-1,0,1]),dtype = "float32")

    Gradientx = cv2.filter2D(grayImg,-1,xkernel)
    Gradienty = cv2.filter2D(grayImg,-1,ykernel)

    Gradientx2 = np.multiply(Gradientx,Gradientx)
    Gradienty2 = np.multiply(Gradienty,Gradienty)

    Gradientxy = np.multiply(Gradientx,Gradienty)

    A = cv2.GaussianBlur(Gradientx2,(3,3),1.5)
    B = cv2.GaussianBlur(Gradienty2,(3,3),1.5)
    C = cv2.GaussianBlur(Gradientxy,(3,3),1.5)

    #计算R = detM - k(traceM)^2
    R = np.zeros(grayImg.shape)
    for i in range(grayImg_h):
        for j in range(grayImg_w):
            M = [[A[i,j],C[i,j]],[C[i,j],B[i,j]]]
            #print("M",M)
            R[i,j] = np.linalg.det(M) - 0.06*(np.trace(M))*(np.trace(M))
            #函数计算输入矩阵的行列式 np.linalg.det
        
    #对R进行处理得到角点图
    for i in range(grayImg_h):
        for j in range(grayImg_w):
            #threshold
            if R[i,j]<np.amin(R)*0.35:
                #print("i",i,"j",j)
                cv2.circle(imgDst,(j,i),8,(0,0,255),1)


if __name__ == "__main__":
     img_path = "timg.jpg"
     imgSrc = cv2.imread(img_path)
     #cv2.namedWindow("src",cv2.WINDOW_NORMAL)
     #cv2.imshow("src",imgSrc)
     #cv2.waitKey(100)
     imgDst = imgSrc
     print(imgSrc.shape)
     detectHarrisCorners(imgSrc,imgDst)

     cv2.namedWindow("harris",cv2.WINDOW_NORMAL)
     cv2.imshow("harris",imgDst)
     cv2.waitKey(0)

3.Harris角点的性质

  1. 参数α对角点检测的影响
    假设已经得到了矩阵M的特征值λ1≥λ2≥0,令λ2=kλ1,0≤k≤1。由特征值与矩阵M的直迹和行列式的关系可得:


    图片.png

    从而可以得到角点的响应


    图片.png

    假设R≥0,则有:
    图片.png

    对于较小的k值,R≈λ2(k−α),α<k。

由此,可以得出这样的结论:增大α的值,将减小角点响应值R,降低角点检测的灵性,减少被检测角点的数量;减小α值,将增大角点响应值R,增加角点检测的灵敏性,增加被检测角点的数量。

  1. Harris角点检测算子对亮度和对比度的变化不敏感
    这是因为在进行Harris角点检测时,使用了微分算子对图像进行微分运算,而微分运算对图像密度的拉升或收缩和对亮度的抬高或下降不敏感。换言之,对亮度和对比度的仿射变换并不改变Harris响应的极值点出现的位置,但是,由于阈值的选择,可能会影响角点检测的数量。


    图片.png

    图片.png
  2. Harris角点检测算子具有旋转不变性
    Harris角点检测算子使用的是角点附近的区域灰度二阶矩矩阵。而二阶矩矩阵可以表示成一个椭圆,椭圆的长短轴正是二阶矩矩阵特征值平方根的倒数。当特征椭圆转动时,特征值并不发生变化,所以判断角点响应值R也不发生变化,由此说明Harris角点检测算子具有旋转不变性。

  3. Harris角点检测算子不具有尺度不变性
    如下图所示,当右图被缩小时,在检测窗口尺寸不变的前提下,在窗口内所包含图像的内容是完全不同的。左侧的图像可能被检测为边缘或曲线,而右侧的图像则可能被检测为一个角点。

图片.png

参考链接:https://www.cnblogs.com/ronny/p/4009425.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352