1. 程式人生 > 其它 >Harris角點檢測

Harris角點檢測

https://www.cnblogs.com/zyly/p/9508131.html

目錄


OpenCV可以檢測影象的主要特徵,然後提取這些特徵、使其成為影象描述符,這類似於人的眼睛和大腦。這些影象特徵可作為影象搜尋的資料庫。此外,人們可以利用這些關鍵點將影象拼接起來,組成一個更大的影象,比如將許多影象放在一塊,然後形成一個360度全景影象。

這裡我們將學習使用OpenCV來檢測影象特徵,並利用這些特徵進行影象匹配和搜尋。我們會選取一些影象,並通過單應性,檢測這些影象是否在另一張影象中。

回到頂部

一 特徵檢測演算法

有許多用於特徵檢測和提取的演算法,我們將會對其中大部分進行介紹。OpenCV最常使用的特徵檢測和提取演算法有:

  • Harris:該演算法用於檢測角點;
  • SIFT:該演算法用於檢測斑點;
  • SURF:該演算法用於檢測角點;
  • FAST:該演算法用於檢測角點;
  • BRIEF:該演算法用於檢測斑點;
  • ORB:該演算法代表帶方向的FAST演算法與具有旋轉不變性的BRIEF演算法;

通過以下方法進行特徵匹配:

  • 暴力(Brute-Force)匹配法;
  • 基於FLANN匹配法;

可以採用單應性進行空間驗證。

回到頂部

二 特徵定義

那麼,究竟什麼是特徵呢?為什麼一副影象的某個特定區域可以作為一個特徵,而其他區域不能呢?粗略的講,特徵就是有意義的影象區域,該區域具有獨特特徵和易於識別性。因此角點及高密度區域都是很好的特徵,而大量重複的模式或低密度區域(例如影象中的藍色天空)則不是很好的特徵。邊緣可以將影象分為兩個區域,因此也可以看做好的特徵。斑點是與周圍有很大差別的畫素區域,也是有意義的特徵。

大多數特徵檢測演算法都會涉及影象的角點、邊和斑點的識別,也有一些涉及脊向的概念,可以認為脊向是細長物體的對稱軸,例如識別影象中的一條路。角點和邊都好理解,那什麼是斑點呢?斑點通常是指與周圍有著顏色和灰度差別的區域。在實際地圖中,往往存在著大量這樣的斑點,如一顆樹是一個斑點,一塊草地是一個斑點,一棟房子也可以是一個斑點。由於斑點代表的是一個區域,相比單純的角點,它的穩定性要好,抗噪聲能力要強,所以它在影象配準上扮演了很重要的角色。

由於某些演算法在識別和提取某型別特徵的時候有較好的效果,所以知道輸入影象是什麼很重要,這樣做有利於選擇最合適的OpenCV工具包。

回到頂部

三 Harris檢測角點特徵

在這之前其實我們已經接觸過角點檢測了,在相機標定的時候,我們就利用到了角點檢測。不過那時候沒有深入的去研究。在這裡,我們將會深入原理去學習角點檢測。

下面我們從使用cornerHarris()函式講起。

cornerHarris(src, blockSize, ksize,k[,dst[,borderType]]);
引數詳解:
  • image:輸入的單通道8位或者浮點影象;
  • blockSize:就是掃描時候視窗的大小。
  • ksize:cornerHarris函式會使用Sobel運算元,該引數定義了Sobel運算元的中孔。簡單來說,該函式定義了角點檢測的敏感度,其值必須介於3~31之間的奇數。
  • k:harris 計算響應公式中的kk值,一般取0.04~0.06;
  • borderType:畫素插值方法;

函式 cornerHarris 對輸入影象進行 Harris 邊界檢測。輸出是一幅浮點值影象,大小與輸入影象大小相同,浮點值越高,表明越可能是特徵角點(我們可以對影象進行閾值化)。

# -*- coding: utf-8 -*-
"""
Created on Mon Aug 20 20:17:34 2018

@author: lenovo
"""

'''
Harris角點檢測
'''
import cv2
import numpy as np

img = cv2.imread('./image/cali.bmp')
img = cv2.resize(img,dsize=(600,400))
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)
#角點檢測 第三個引數為角點檢測的敏感度,其值必須介於3~31之間的奇數
dst = cv2.cornerHarris(gray,3,23,0.04)
print(dst.shape)  #(400, 600)
img[dst>0.01*dst.max()] = [0,0,255]
cv2.imshow('',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

執行結果如下:

如果我們把第三個引數改為3:,可以看到:

回到頂部

四 Harris檢測原理

上面我們已經通過例項演示了Harris檢測的效果,相信你對Harris角點檢測已經有了初步的認識。這裡我將帶你深入瞭解Harris角點檢測的原理。

我們先來看一幅圖片,瞭解一下什麼是角點?

上圖中E,F中的角我們通常稱作角點(corner points),他們具有以下特徵:

  • 輪廓之間的交點;
  • 對於同一場景,即使視角發生變化,通常具備穩定性質的特徵;
  • 該點附近區域的畫素點無論在梯度方向上還是其梯度幅值上有著較大變化;

harris特徵角最早在paper A Combined Corner and Edge Detector中被Chris Harris & Mike Stephens提出。

Harris角點檢測的基本思想:演算法基本思想是使用一個固定視窗在影象上進行任意方向上的滑動,比較滑動前與滑動後兩種情況,視窗中的畫素灰度變化程度,如果存在任意方向上的滑動,都有著較大灰度變化,那麼我們可以認為該視窗中存在角點。

1、灰度變化描述

當視窗發生[u,v][u,v]移動時,那麼滑動前與滑動後對應的視窗中的畫素點灰度變化描述如下:

E(u,v)=(x,y)Ww(x,y)[I(x+u,y+v)I(x,y)]2E(u,v)=∑(x,y)€Ww(x,y)[I(x+u,y+v)−I(x,y)]2

引數解釋:

  • [u,v][u,v]是視窗WW的偏移量;
  • (x,y)(x,y)是視窗WW所對應的畫素座標位置,視窗有多大,就有多少個位置;
  • I(x,y)I(x,y)是畫素座標位置(x,y)(x,y)的影象灰度值;
  • I(x+u,y+v)I(x+u,y+v)是畫素座標位置(x+u,y+v)(x+u,y+v)的影象灰度值;
  • w(x,y)w(x,y)是視窗函式,最簡單情形就是視窗WW內的所有畫素所對應的ww權重係數均為1.但有時候,我們會將w(x,y)w(x,y)函式設定為以視窗WW中心為原點的二元正太分佈。如果視窗WW中心點是角點時,移動前與移動後,該點在灰度變化貢獻最大;而離視窗WW中心(角點)較遠的點,這些點的灰度變化幾近平緩,這些點的權重係數,可以設定小值,以示該點對灰度變化貢獻較小,那麼我們自然而然想到使用二元高斯函式來表示視窗函式;

我們的視窗函式通常有如下兩種形式:

根據上述表示式,當視窗在平潭區域上移動,可以想象得到,灰度不會發生什麼變換。E(u,v)=0E(u,v)=0;如果視窗處在紋理比較豐富的區域上滑動,那麼灰度變化會很大。演算法最終思想就是計算灰度發生較大變化時所對應的位置,當然這個較大是指任意方向上的滑動,並非單指某個方向。

2、E(u,v)E(u,v)化簡

首先需要了解泰勒公式,任何一個函式表示式,均可有泰勒公式進行展開,以逼近原函式,我們可以對下面函式進行一階展開(如果對泰勒公式忘記了,可以翻翻本科所學的高等數學)。

f(x+u,y+v)f(x,y)+ufx(x,y)+vfy(x,y)f(x+u,y+v)≈f(x,y)+ufx(x,y)+vfy(x,y)

那麼

(x,y)Ww(x,y)[I(x+u,y+v)I(x,y)]2∑(x,y)€Ww(x,y)[I(x+u,y+v)−I(x,y)]2 (x,y)Ww(x,y)[I(x,y)+uIx+vIyI(x,y)]2≈∑(x,y)€Ww(x,y)[I(x,y)+uIx+vIy−I(x,y)]2 =(x,y)Ww(x,y)[u2I2x+2uvIxIy+v2I2y]=∑(x,y)€Ww(x,y)[u2Ix2+2uvIxIy+v2Iy2] =(x,y)Ww(x,y)[uv][I2xIxIyIxIyI2y][uv]=∑(x,y)€Ww(x,y)[uv][Ix2IxIyIxIyIy2][uv] =[uv]((x,y)Ww(x,y)[I2xIxIyIxIyI2y])[uv]=[uv](∑(x,y)€Ww(x,y)[Ix2IxIyIxIyIy2])[uv]

所以E(u,v)E(u,v)表示式可以更新為:

E(u,v)=[uv]M[uv]E(u,v)=[uv]M[uv]

其中:M=(x,y)Ww(x,y)[I2xIxIyIxIyI2y]M=∑(x,y)€Ww(x,y)[Ix2IxIyIxIyIy2],IxIx,IyIy分別為視窗內畫素點(x,y)(x,y)在xx方向上和yy方向上的梯度值。

3、矩陣MM的關鍵性

難道我們是直接求上述的E(u,v)E(u,v)值來判斷角點嗎?Harris角點檢測並沒有這樣做,而是通過對視窗內的每個畫素的xx方向上的梯度與yy方向上的梯度進行統計分析。這裡以IxIx和IyIy為座標軸,因此每個畫素的梯度座標可以表示成(Ix,Iy)(Ix,Iy)。針對平坦區域,邊緣區域以及角點區域三種情形進行分析:

下圖是對這三種情況視窗中的對應畫素的梯度分佈進行繪製:

不知道大家有沒有注意到這三種區域的特點:

  • 平坦區域上的每個畫素點所對應的(Ix,Iy)(Ix,Iy)座標分佈在原點附近,其實也很好理解,針對平坦區域的畫素點,他們的梯度方向雖然各異,但是其幅值都不是很大,所以均聚集在原點附近;
  • 邊緣區域有一座標軸分佈較散,至於是哪一個座標上的資料分佈較散不能一概而論,這要視邊緣在影象上的具體位置而定,如果邊緣是水平或者垂直方向,那麼IyIy軸方向或者IxIx方向上的資料分佈就比較散;
  • 角點區域的xx、yy方向上的梯度分佈都比較散。

我們是不是可以根據這些特徵來判斷哪些區域存在角點呢?

上面我們已經計算出了MM矩陣:

M=(x,y)Ww(x,y)[I2xIxIyIxIyI2y]=[ACCB]M=∑(x,y)€Ww(x,y)[Ix2IxIyIxIyIy2]=[ACCB]

我們可以將E(u,v)E(u,v)近似為二項函式:

E(u,v)=Au2+2Cuv+Bv2E(u,v)=Au2+2Cuv+Bv2

其中

A=(x,y)Ww(x,y)I2xA=∑(x,y)€Ww(x,y)∗Ix2 B=(x,y)Ww(x,y)I2yB=∑(x,y)€Ww(x,y)∗Iy2 C=(x,y)Ww(x,y)IxIyC=∑(x,y)€Ww(x,y)∗IxIy

二次項函式本質上就是一個橢圓函式。橢圓的長和寬是由MM的特徵值λ1,λ2λ1,λ2決定的(橢圓的長短軸正是矩陣MM特徵值平方根的倒數),橢圓的方向是由MM的特徵向量決定的,橢圓方程為:

[uv]M[uv]=1[uv]M[uv]=1

如果使用橢圓進行資料集表示,則繪製圖示如下:

雖然我們利用E(u,v)E(u,v)來描述角點的基本思想,然而最終我們僅僅使用的是矩陣MM。讓我們看看矩陣MM形式,是不是跟協方差矩陣形式很像,像歸像,但是還是有些不同,哪兒不同?一般協方差矩陣對應維的隨機變數需要減去該維隨機變數的均值:

IxIx,IyIy看成兩個欄位,假設視窗內有m個畫素點,也就是等價於有m個樣本,我們先計算每個欄位的均值:

Ix¯=i=1mIxiIx¯=∑i=1mIxi Iy¯=i=1mIyiIy¯=∑i=1mIyi

我們仍然使用(Ixi,Iyi)(Ixi,Iyi)表示樣本(Ixi,Iyi)(Ixi,Iyi)去均值後的值,則由這m個樣本組成的矩陣:

X=[Ix1Iy1Ix2Iy2......IxmIym]X=[Ix1Ix2...IxmIy1Iy2...Iym]

則對應協方差矩陣可以寫成:

C=1mXXT=1mi=1m[I2xIxIyIxIyI2y]C=1mXXT=1m∑i=1m[Ix2IxIyIxIyIy2]

但矩陣MM中並沒有這樣做,所以在矩陣MM裡,我們先進行各維的均值化處理,那麼各維所對應的隨機變數的均值為0,協方差矩陣就大大簡化了,簡化的最終結果就是矩陣MM,是否明白了(注意為了簡化運算,我們先假設MM矩陣中的權重係數w(x,y)=1w(x,y)=1,並且省略掉了求均值)我們的目的是分析資料的主要成分,相信瞭解PCA原理的,應該都瞭解均值化的作用。

M=(x,y)W[I2xIxIyIxIyI2y]M=∑(x,y)€W[Ix2IxIyIxIyIy2]

如果我們對協方差矩陣MM進行對角化,很明顯,其對角線就是各個欄位的方差,這點大家應該明白吧?不明白的話可以複習下PCA原理。

  • 如果兩個欄位(Ix,Iy)(Ix,Iy)所對應的特徵值都比較大,說明什麼? 畫素點的梯度分佈比較散,梯度變化程度比較大,符合角點在視窗區域的特點;
  • 如果是平坦區域,那麼畫素點的梯度所構成的點集比較集中在原點附近,因為視窗區域內的畫素點的梯度幅值非常小,此時矩陣MM的對角化的兩個特徵值比較小;
  • 如果是邊緣區域,在計算畫素點的xx、yy方向上的梯度時,邊緣上的畫素點的某個方向的梯度幅值變化比較明顯,另一個方向上的梯度幅值變化較弱,其餘部分的點都還是集中原點附近,這樣MM對角化後的兩個特徵值理論應該是一個比較大,一個比較小,當然對於邊緣這種情況,可能是呈45°的邊緣,致使計算出的特徵值並不是都特別的大,總之跟含有角點的視窗的分佈情況還是不同的。

注:MM為協方差矩陣,需要大家自己去理解下,視窗中的畫素集構成一個矩陣(XR2×mX€R2×m,假設這裡有m個畫素點),使用該矩陣乘以該矩陣的轉置,即是協方差矩陣。

因此可以得出下列結論:

  • 特徵值都比較大時,即視窗中含有角點;
  • 特徵值一個較大,一個較小,視窗中含有邊緣;
  • 特徵值都比較小,視窗處在平坦區域;

4、如何度量角點響應

通常用下面表示式進行度量,對每一個視窗計算得到一個分數RR,根據RR的大小來判定視窗內是否存在harris特徵角。分數RR根據下面公式計算得到:

R=det(M)k(trace(M))2R=det(M)−k(trace(M))2 det(M)=λ1λ2det(M)=λ1λ2 trace(M)=λ1+λ2trace(M)=λ1+λ2

這裡λ1,λ2λ1,λ2是矩陣MM的2個特徵值,kk是一個指定值,這是一個經驗引數,需要實驗確定它的合適大小,通常它的值在0.04和0.06之間,它的存在只是調節函式的形狀而已。

RR取決於MM的特徵值,對於角點|R||R|很大,平坦的區域|R||R|很小,邊緣的RR為負值;

但是為什麼會使用這樣的表示式呢?一下子是不是感覺很難理解?其實也不難理解,函式表示式一旦出來,我們就可以繪製它的影象,而這個函式圖形正好滿足上面幾個區域的特徵。 通過繪製函式影象,直觀上更能理解。繪製的RR函式影象如下:

所以說難點不在於理解這個函式表示式,而在於如何創造出這個函式表示式。Harris也許對很多函式模型非常瞭解,對於創造出這樣的一個函式表示式,易如反掌,當然在我們看來感覺是很了不起的,那是因為我們見過的函式模型太少。

最後設定R的閾值,進行角點判斷。當然其中還有些後處理步驟就不再說了,比如說角點的極大值抑制等。

非極大值抑制的原理,在一個視窗內,如果有很多角點則用值最大的那個角點,其他的角點都刪除。

注意:有些朋友在問是如何通過矩陣判斷角點的? 其實上面,我們已經推匯出E(u,v)E(u,v)的表示式,大家看看這個表示式有什麼特徵,其中矩陣M是實對稱矩陣,那麼E表示式其實就是二次型,對於二次型想必大家會有印象,uu,vv代表視窗滑動方向以及滑動量,EE代表灰度變化,通過矩陣M進行特徵值求解,而特徵值所對應的特徵向量即為灰度變化方向。如果兩個特徵值較大,則表示有兩個方向灰度變化較快。所以可以直接通過求解MM的特徵值進行角點判斷.

回到頂部

五 自己實現Harris角點檢測

Harris角點檢測可以分為5個步驟:

1、計算影象I(x,y)I(x,y)在xx和yy兩個方向的梯度IxIx,IyIy;

Ix=Ix=I×[101]Ix=∂I∂x=I×[−101] Iy=Iy=I×[101]TIy=∂I∂y=I×[−101]T

2、計算影象兩個方向梯度的乘積;

I2x=IxIxIx2=Ix∗Ix I2y=IyIyIy2=Iy∗Iy IxIy=IxIyIxIy=Ix∗Iy

3、使用高斯函式對I2xIx2、I2yIy2、IxIyIxIy進行高斯加權(取σ=2,ksize=3),計算中心點為(x,y)(x,y)的視窗WW對應的矩陣MM;

A=(x,y)Wg(I2x)=(x,y)WI2xw(x,y)A=∑(x,y)€Wg(Ix2)=∑(x,y)€WIx2∗w(x,y) B=(x,y)Wg(I2y)=(x,y)WI2yw(x,y)B=∑(x,y)€Wg(Iy2)=∑(x,y)€WIy2∗w(x,y) C=(x,y)Wg(IxIy)=(x,y)WIxIyw(x,y)C=∑(x,y)€Wg(IxIy)=∑(x,y)€WIxIy∗w(x,y)

其中M=[ACCB]=(x,y)Ww(x,y)[I2xIxIyIxIyI2y]M=[ACCB]=∑(x,y)€Ww(x,y)[Ix2IxIyIxIyIy2].

4、計算每個畫素點(x,y)(x,y)處的Harris響應值RR;

R=det(M)k(trace(M))2R=det(M)−k(trace(M))2

5、過濾大於某一閾值tt的RR值;

R={R:det(M)k(trace(M))2>t}R={R:det(M)−k(trace(M))2>t}

如果需要在3×3或者5×5的鄰域進行非最大值抑制,則區域性最大值點即為影象中的角點。

以上所有公式*表示逐畫素點乘。

# -*- coding: utf-8 -*-
"""
Created on Mon Aug 20 20:17:34 2018

@author: lenovo
"""

'''
Harris角點檢測
'''
import cv2
import numpy as np

def test():
    '''
    呼叫系統庫函式進行測試
    '''
    img = cv2.imread('./image/cali.bmp')
    img = cv2.resize(img,dsize=(600,400))
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    gray = np.float32(gray)
    #角點檢測 第三個引數為角點檢測的敏感度,其值必須介於3~31之間的奇數
    dst = cv2.cornerHarris(gray,3,3,0.04)
    print(dst.shape)  #(400, 600)
    img[dst>0.01*dst.max()] = [0,0,255]
    cv2.imshow('',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
def harris_detect(img,ksize=3):
    '''
    自己實現角點檢測
    
    params:
        img:灰度圖片
        ksize:Sobel運算元視窗大小
        
    return:
        corner:與源影象一樣大小,角點處畫素值設定為255
    '''
    k = 0.04                 #響應函式k
    threshold = 0.01         #設定閾值  
    WITH_NMS = False         #是否非極大值抑制
    
    
    #1、使用Sobel計算畫素點x,y方向的梯度
    h,w = img.shape[:2]
    #Sobel函式求完導數後會有負值,還有會大於255的值。而原影象是uint8,即8位無符號數,所以Sobel建立的影象位數不夠,會有截斷。因此要使用16位有符號的資料型別,即cv2.CV_16S。
    grad = np.zeros((h,w,2),dtype=np.float32)
    grad[:,:,0] = cv2.Sobel(img,cv2.CV_16S,1,0,ksize=3)
    grad[:,:,1] = cv2.Sobel(img,cv2.CV_16S,0,1,ksize=3)

    #2、計算Ix^2,Iy^2,Ix*Iy 
    m = np.zeros((h,w,3),dtype=np.float32)
    m[:,:,0] = grad[:,:,0]**2
    m[:,:,1] = grad[:,:,1]**2
    m[:,:,2] = grad[:,:,0]*grad[:,:,1]
        
    #3、利用高斯函式對Ix^2,Iy^2,Ix*Iy進行濾波
    m[:,:,0] = cv2.GaussianBlur(m[:,:,0],ksize=(ksize,ksize),sigmaX=2)    
    m[:,:,1] = cv2.GaussianBlur(m[:,:,1],ksize=(ksize,ksize),sigmaX=2)
    m[:,:,2] = cv2.GaussianBlur(m[:,:,2],ksize=(ksize,ksize),sigmaX=2)    
    m = [np.array([[m[i,j,0],m[i,j,2]],[m[i,j,2],m[i,j,1]]]) for i in range(h) for j in range(w)]
    
    #4、計算區域性特徵結果矩陣M的特徵值和響應函式R(i,j)=det(M)-k(trace(M))^2  0.04<=k<=0.06
    D,T = list(map(np.linalg.det,m)),list(map(np.trace,m))
    R = np.array([d-k*t**2 for d,t in zip(D,T)])

    #5、將計算出響應函式的值R進行非極大值抑制,濾除一些不是角點的點,同時要滿足大於設定的閾值
    #獲取最大的R值
    R_max = np.max(R)    
    #print(R_max)
    #print(np.min(R))
    R = R.reshape(h,w)
    corner = np.zeros_like(R,dtype=np.uint8)
    for i in range(h):
        for j in range(w):
            if WITH_NMS:
                #除了進行進行閾值檢測 還對3x3鄰域內非極大值進行抑制(導致角點很小,會看不清)
                if R[i,j] > R_max*threshold and R[i,j] == np.max(R[max(0,i-1):min(i+2,h-1),max(0,j-1):min(j+2,w-1)]):
                    corner[i,j] = 255
            else:
                #只進行閾值檢測
                if R[i,j] > R_max*threshold :
                    corner[i,j] = 255   
    return corner
    
if __name__=='__main__':
    img = cv2.imread('./image/cali.bmp')
    img = cv2.resize(img,dsize=(600,400))
    #轉換為灰度影象
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    dst = harris_detect(gray)
    print(dst.shape)  #(400, 600)
    img[dst>0.01*dst.max()] = [0,0,255]
    cv2.imshow('',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

執行效果如下:

回到頂部

六 Harries角點的性質

1、引數kk對角點檢測的影響

假設已經得到了矩陣MM的特徵值λ1λ20λ1≥λ2≥0,令λ2=αλ1λ2=αλ1,0α10≤α≤1。由特徵值與矩陣MM的直跡和行列式的關係可得:

detM=iλidetM=∏iλi trace(M)=iλitrace(M)=∑iλi

從而可以得到角點的響應:

R=λ1λ2k(λ1+λ2)2=λ21(αk(1+α)2)R=λ1λ2−k(λ1+λ2)2=λ12(α−k(1+α)2)

假設R0R≥0,則有:

0kα(1+α)20.250≤k≤α(1+α)2≤0.25

對於較小的αα值,Rλ21(αk),α<kR≈λ12(α−k),α<k。

由此,可以得出這樣的結論,增大kk的值,降低角點檢測的靈敏度,減少被檢測角點的數量;減少kk值,增加角點檢測的靈敏度,增加被檢測角點的數量。

2、Harris角點檢測運算元對亮度和對比度的變化不靈敏

這是因為在進行Harris角點檢測時,使用了微分運算元對影象進行微分運算,而微分運算對影象密度的拉昇或收縮和對亮度的抬高或下降不敏感。換言之,對亮度和對比度的仿射變換並不改變Harris響應的極值點出現的位置,但是,由於閾值的選擇,可能會影響角點檢測的數量。

左圖表示亮度變化,右圖表示對比度變化。

3、Harris角點檢測運算元具有旋轉不變性

Harris角點檢測運算元使用的是角點附近的區域灰度二階矩矩陣。而二階矩矩陣可以表示成一個橢圓,橢圓的長短軸正是二階矩矩陣特徵值平方根的倒數。當特徵橢圓轉動時,特徵值並不發生變化,所以判斷角點響應值RR也不發生變化,由此說明Harris角點檢測運算元具有旋轉不變性。

4.、Harris角點檢測運算元不具有尺度不變性

如下圖所示,當影象被縮小時,在檢測視窗尺寸不變的前提下,在視窗內所包含影象的內容是完全不同的。左側的影象可能被檢測為邊緣或曲線,而右側的影象則可能被檢測為一個角點。

參考文獻:

[1]OpenCV教程(43) harris角的檢測(1)

[2]Harris角點檢測原理詳解

[3]PCA的數學原理

[4]影象處理基礎(4):高斯濾波器詳解

[5]Harris角點

[6]『Python』Harris角點檢測程式碼實現

[7]斑點檢測

[8]Harris原理及原始碼解析(C++)