1. 程式人生 > >第十一節、Harris角點檢測原理(附原始碼)

第十一節、Harris角點檢測原理(附原始碼)

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 計算響應公式中的$k$值,一般取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]$移動時,那麼滑動前與滑動後對應的視窗中的畫素點灰度變化描述如下:

$$E(u,v)=\sum\limits_{(x,y)€W}w(x,y)[I(x+u,y+v)-I(x,y)]^2$$

引數解釋:

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

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

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

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

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

$$f(x+u,y+v)≈f(x,y)+uf_x(x,y)+vf_y(x,y)$$

那麼

$$\sum\limits_{(x,y)€W}w(x,y)[I(x+u,y+v)-I(x,y)]^2$$

$$≈\sum\limits_{(x,y)€W}w(x,y)[I(x,y)+uI_x+vI_y-I(x,y)]^2$$

$$=\sum\limits_{(x,y)€W}w(x,y)[u^2I_x^2+2uvI_xI_y+v^2I_y^2]$$

$$=\sum\limits_{(x,y)€W}w(x,y)\begin{bmatrix}u & v\end{bmatrix}\begin{bmatrix} I_x^2 & I_xIy \\   I_xI_y & I_y^2\end{bmatrix}\begin{bmatrix}u \\ v\end{bmatrix}$$

$$=\begin{bmatrix}u & v\end{bmatrix}(\sum\limits_{(x,y)€W}w(x,y)\begin{bmatrix} I_x^2 & I_xIy \\   I_xI_y & I_y^2\end{bmatrix})\begin{bmatrix}u \\ v\end{bmatrix}$$

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

$$E(u,v)=\begin{bmatrix}u & v\end{bmatrix}M\begin{bmatrix}u \\ v\end{bmatrix}$$

其中:$M=\sum\limits_{(x,y)€W}w(x,y)\begin{bmatrix} I_x^2 & I_xIy \\   I_xI_y & I_y^2\end{bmatrix}$,$I_x$,$I_y$分別為視窗內畫素點$(x,y)$在$x$方向上和$y$方向上的梯度值。

3、矩陣$M$的關鍵性

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

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

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

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

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

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

$M=\sum\limits_{(x,y)€W}w(x,y)\begin{bmatrix} I_x^2 & I_xIy \\   I_xI_y & I_y^2\end{bmatrix}=\begin{bmatrix} A & C \\   C & B \end{bmatrix}$

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

$$E(u,v)=Au^2+2Cuv+Bv^2$$

其中

$$A=\sum\limits_{(x,y)€W}w(x,y)*I_x^2$$

$$B=\sum\limits_{(x,y)€W}w(x,y)*I_y^2$$

$$C=\sum\limits_{(x,y)€W}w(x,y)*I_xI_y$$

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

$$\begin{bmatrix} u & v \end{bmatrix}M\begin{bmatrix} u \\ v \end{bmatrix}=1$$

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

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

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

$$\bar{I_x}=\sum\limits_{i=1}^{m}I_{xi}$$

$$\bar{I_y}=\sum\limits_{i=1}^{m}I_{yi}$$

我們仍然使用$(I_{xi},I_{yi})$表示樣本$(I_{xi},I_{yi})$去均值後的值,則由這m個樣本組成的矩陣:

$$X=\begin{bmatrix} I_{x1} & I_{x2} & ... & I_{xm} \\ I_{y1} & I_{y2} & ... & I_{ym}\end{bmatrix}$$

則對應協方差矩陣可以寫成:$$C=\frac{1}{m}XX^T=\frac{1}{m}\sum\limits_{i=1}^{m}\begin{bmatrix} I_x^2 & I_xIy \\ I_xI_y & I_y^2 \end{bmatrix}$$

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

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

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

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

因此可以得出下列結論:

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

4、如何度量角點響應

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

$$R=det(M)-k(trace(M))^2$$

$$det(M)=λ_1λ_2$$

$$trace(M)=λ_1+λ_2$$

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

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

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

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

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

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

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

五 自己實現Harris角點檢測

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

1、計算影象$I(x,y)$在$x$和$y$兩個方向的梯度$I_x$,$I_y$;

$$I_x=\frac{∂I}{∂x}=I×\begin{bmatrix} -1 & 0 & 1 \end{bmatrix}$$

$$I_y=\frac{∂I}{∂y}=I×\begin{bmatrix} -1 & 0 & 1 \end{bmatrix}^T$$

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

$$I_x^2=I_x*I_x$$

$$I_y^2=I_y*I_y$$

$$I_xI_y=I_x*I_y$$

3、使用高斯函式對$I_x^2$、$I_y^2$、$I_xI_y$進行高斯加權(取σ=2,ksize=3),計算中心點為$(x,y)$的視窗$W$對應的矩陣$M$;

$$A=\sum\limits_{(x,y)€W}g(I_x^2)=\sum\limits_{(x,y)€W}I_x^2*w(x,y)$$

$$B=\sum\limits_{(x,y)€W}g(I_y^2)=\sum\limits_{(x,y)€W}I_y^2*w(x,y)$$

$$C=\sum\limits_{(x,y)€W}g(I_xI_y)=\sum\limits_{(x,y)€W}I_xI_y*w(x,y)$$

其中$M=\begin{bmatrix} A& C \\C  & B\end{bmatrix}=\sum\limits_{(x,y)€W}w(x,y)\begin{bmatrix} I_x^2 & I_xIy \\   I_xI_y & I_y^2\end{bmatrix}$.

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

$$R=det(M)-k(trace(M))^2$$

5、過濾大於某一閾值$t$的$R$值;

$$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、引數$k$對角點檢測的影響

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

$$detM=\prod\limits_{i}λ_i$$  $$trace(M)=\sum\limits_{i}λ_i$$

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

$$R=λ_1λ_2-k(λ_1+λ_2)^2=λ_1^2(α-k(1+α)^2)$$

假設$R≥0$,則有:

$$0≤k≤\frac{α}{(1+α)^2}≤0.25$$

對於較小的$α$值,$R≈λ_1^2(α-k),α<k$。

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

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

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

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

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

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

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

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

 參考文獻:

斑點檢測

相關推薦

Harris檢測原理(原始碼)

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

Harris檢測原理

str 物體 per 權重 模式 windows www http 特定 OpenCV可以檢測圖像的主要特征,然後提取這些特征、使其成為圖像描述符,這類似於人的眼睛和大腦。這些圖像特征可作為圖像搜索的數據庫。此外,人們可以利用這些關鍵點將圖像拼接起來,組成一個更大的圖像,比

FAST檢測(原始碼)

在前面我們已經陸續介紹了許多特徵檢測運算元,我們可以根據影象區域性的自相關函式求得Harris角點,後面又提到了兩種十分優秀的特徵點以及他們的描述方法SIFT特徵和SURF特徵。SURF特徵是為了提高運算效率對SIFT特徵的一種近似,雖然在有些實驗環境中已經達到了實時,但是我們實踐工程應用中,特徵點的提取與匹

OpenCV-Python系列·第二五集:Harris檢測

Tip:Harris角點檢測 # -*- coding: utf-8 -*- """ Created on Sat Sep 22 21:18:41 2018 @author: Administrat

Harris檢測原理

1. 首先,我們不禁要問什麼是harris角點?        對於角點,到目前為止還沒有明確的數學定義。但是你可以認為角點就是極值點,即在某方面屬性特別突出的點。一般的角點檢測都是對有具體定義的、或者是能夠具體檢測出來的興趣點的檢測。這意味著興趣點可以是角點,是在某些屬性

Harris檢測原理分析

http://blog.csdn.net/newthinker_wei/article/details/45603583 http://www.360doc.com/content/15/1212/23/20007814_519967668.shtml 本文將該文拷

Harris檢測原理與opencv(python)實現

在學習時主要參考了1.http://blog.csdn.net/xiaowei_cqu/article/details/7805206和opencv-python官方的關於harris的文件(http://opencv-python-tutroals.readthedocs

Harris檢測原理詳解外加原始碼分析

 網上有很多Harris角點檢測的資料,但是或多或少有一些缺陷,有的講清楚了原理,卻沒有給出程式碼的實現,有的給出了程式碼的實現,卻沒給出原理性的解釋。為此,我找出了幾篇部落格,將他們綜合整理在一起,有一套理論到程式碼的完整實現過程,這才是學一門演算法或運算元的正確方法。

Harris檢測原理及C++實現

1. 首先,我們不禁要問什麼是harris角點?        對於角點,到目前為止還沒有明確的數學定義。但是你可以認為角點就是極值點,即在某方面屬性特別突出的點。一般的角點檢測都是對有具體定義的、或者是能夠具體檢測出來的興趣點的檢測。這意味著興趣點可以是角點,是在某些

Harris檢測原理及實現

一、原理 二、實現 close all; clear all; I=imread('test.tif'); [posX,posY]=harris(I); figure;imshow(I); hol

異常類的構建-------------狄泰軟件學院

end ++ pla ini images 數據 pointer oid 變量 一、自定義異常類 1、異常的類型可以是自定義的類類型 2、對於類類型的匹配依舊是之上而下的嚴格匹配 3、賦值兼容性原則在異常匹配中依然適用 所以要 (1)、匹配子類異常的catch放在上部 (2

python學習筆記(叠代和其他)

技術分享 img 余數 商品列表 步長 取數 sorted函數 學習 四舍五入 yiled 面相過程編程 造好內容,統一發給下面 上面這個是傻瓜版 內置函數 print(divmod(10,3)) 將10除以3,顯示商和余數 enumerate函數,顯示元素及它

HTML學習筆記 w3sCss盒子模型應用 (原創)

.com foo margin images href ack har htm com <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> &l

c#基礎知識

var part 包括 introduce new 構造 bsp private 根據 析構方法 和構造方法相反。 class person { public string Name { get;

OpenGL:拉伸和過濾

bind wap fromfile 坐標 .cpp mfile identity get ott LTexture.hvoid render( GLfloat x, GLfloat y, LFRect* clip = NULL, LFRect* stretch = NULL

:Bundles壓縮合並js和css及原理分析

string數組 tab 速度 操作 spn sof 參考 reader 調試 一. 簡介 1.背景:瀏覽器默認一次性請求的網絡數是有上限的,如果你得js和css文件太多,就會導致瀏覽器需要多次加載,影響頁面的加載速度, MVC中提供Bundles的方式壓縮合並js和cs

學習筆記

作業linux和windows互傳文件 互傳文件 先安裝一個工具 yum install -y lrzsz 使用sz命令 就可以把linux上的文件傳到windows上去。 rz 就可以把windows上的東西傳到linux上 (當前目錄) 前提是用 xshell securecrt putty是

韋伯局部描述符(WLB)

times 向量 font .com ima 灰度共生矩陣 領域 局部特征 limit 紋理作為一種重要的視覺線索,是圖像中普遍存在而又難以描述的特征,圖像的紋理特征一般是指圖像上地物重復排列造成的灰度值有規則的分布。紋理特征的關鍵在於紋理特征的提取方法。目前,用於紋理特征

基於傳統影象處理的目標檢測與識別(詞袋模型BOW+SVM程式碼)

在上一節、我們已經介紹了使用HOG和SVM實現目標檢測和識別,這一節我們將介紹使用詞袋模型BOW和SVM實現目標檢測和識別。 一 詞袋介紹 詞袋模型(Bag-Of-Word)的概念最初不是針對計算機視覺的,但計算機視覺會使用該概念的升級。詞袋最早出現在神經語言程式學(NLP)和資訊檢索(IR)領域,該模型

SEO自學網體系教程:網站日誌與SEO

  首先,說說怎麼檢視網站日誌。以IIS中介軟體為例。     選擇一個網站 --> 高階設定 ,記住這裡的ID   然後到系統盤(日誌檔案一般在系統盤),一般在C:inetpublogsLogFiles