Harris角點兩篇比較好的文章

主要轉載下面兩篇博文,因爲講的比較好,放到一起便於理解

1. Harris角點點我進入原文

2.  

Harris角點檢測原理分析 點我進入原文


============================【Harris角點】=======================

1. 不同類型的角點

在現實世界中,角點對應於物體的拐角,道路的十字路口、丁字路口等。從圖像分析的角度來定義角點可以有以下兩種定義:

  1. 角點可以是兩個邊緣的角點;
  2. 角點是鄰域內具有兩個主方向的特徵點;

前者往往需要對圖像邊緣進行編碼,這在很大程度上依賴於圖像的分割與邊緣提取,具有相當大的難度和計算量,且一旦待檢測目標局部發生變化,很可能導致操作的失敗。早期主要有Rosenfeld和Freeman等人的方法,後期有CSS等方法。

基於圖像灰度的方法通過計算點的曲率及梯度來檢測角點,避免了第一類方法存在的缺陷,此類方法主要有Moravec算子、Forstner算子、Harris算子、SUSAN算子等。

image

這篇文章主要介紹的Harris角點檢測的算法原理,比較著名的角點檢測方法還有jianbo Shi和Carlo Tomasi提出的Shi-Tomasi算法,這個算法開始主要是爲了解決跟蹤問題,用來衡量兩幅圖像的相似度,我們也可以把它看爲Harris算法的改進。OpenCV中已經對它進行了實現,接口函數名爲GoodFeaturesToTrack()。另外還有一個著名的角點檢測算子即SUSAN算子,SUSAN是Smallest Univalue Segment Assimilating Nucleus(最小核值相似區)的縮寫。SUSAN使用一個圓形模板和一個圓的中心點,通過圓中心點像素與模板圓內其他像素值的比較,統計出與圓中心像素近似的像元數量,當這樣的像元數量小於某一個閾值時,就被認爲是要檢測的角點。我覺得可以把SUSAN算子看爲Harris算法的一個簡化。這個算法原理非常簡單,算法效率也高,所以在OpenCV中,它的接口函數名稱爲:FAST() 。

2. Harris角點

2.1 基本原理

人眼對角點的識別通常是在一個局部的小區域或小窗口完成的。如果在各個方向上移動這個特徵的小窗口,窗口內區域的灰度發生了較大的變化,那麼就認爲在窗口內遇到了角點。如果這個特定的窗口在圖像各個方向上移動時,窗口內圖像的灰度沒有發生變化,那麼窗口內就不存在角點;如果窗口在某一個方向移動時,窗口內圖像的灰度發生了較大的變化,而在另一些方向上沒有發生變化,那麼,窗口內的圖像可能就是一條直線的線段。

image

對於圖像I(x,y)I(x,y),當在點(x,y)(x,y)處平移(Δx,Δy)(Δx,Δy)後的自相似性,可以通過自相關函數給出:

c(x,y;Δx,Δy)=(u,v)W(x,y)w(u,v)(I(u,v)I(u+Δx,v+Δy))2c(x,y;Δx,Δy)=∑(u,v)∈W(x,y)w(u,v)(I(u,v)–I(u+Δx,v+Δy))2

其中,W(x,y)W(x,y)是以點(x,y)(x,y)爲中心的窗口,w(u,v)w(u,v)爲加權函數,它既可是常數,也可以是高斯加權函數。

image

根據泰勒展開,對圖像I(x,y)I(x,y)在平移(Δx,Δy)(Δx,Δy)後進行一階近似:

I(u+Δx,v+Δy)=I(u,v)+Ix(u,v)Δx+Iy(u,v)Δy+O(Δx2,Δy2)I(u,v)+Ix(u,v)Δx+Iy(u,v)ΔyI(u+Δx,v+Δy)=I(u,v)+Ix(u,v)Δx+Iy(u,v)Δy+O(Δx2,Δy2)≈I(u,v)+Ix(u,v)Δx+Iy(u,v)Δy

其中,Ix,IyIx,Iy是圖像I(x,y)I(x,y)的偏導數,這樣的話,自相關函數則可以簡化爲:

c(x,y;Δx,Δy)w(Ix(u,v)Δx+Iy(u,v)Δy)2=[Δx,Δy]M(x,y)[ΔxΔy]c(x,y;Δx,Δy)≈∑w(Ix(u,v)Δx+Iy(u,v)Δy)2=[Δx,Δy]M(x,y)[ΔxΔy]

其中

M(x,y)=w[Ix(x,y)2Ix(x,y)Iy(x,y)Ix(x,y)Iy(x,y)Iy(x,y)2]=[wIx(x,y)2wIx(x,y)Iy(x,y)wIx(x,y)Iy(x,y)wIy(x,y)2]=[ACCB]M(x,y)=∑w[Ix(x,y)2Ix(x,y)Iy(x,y)Ix(x,y)Iy(x,y)Iy(x,y)2]=[∑wIx(x,y)2∑wIx(x,y)Iy(x,y)∑wIx(x,y)Iy(x,y)∑wIy(x,y)2]=[ACCB]

也就是說圖像I(x,y)I(x,y)在點(x,y)(x,y)處平移(Δx,Δy)(Δx,Δy)後的自相關函數可以近似爲二項函數:

c(x,y;Δx,Δy)AΔx2+2CΔxΔy+BΔy2c(x,y;Δx,Δy)≈AΔx2+2CΔxΔy+BΔy2

其中

A=wI2x,B=wI2y,C=wIxIyA=∑wIx2,B=∑wIy2,C=∑wIxIy

二次項函數本質上就是一個橢圓函數。橢圓的扁率和尺寸是由M(x,y)M(x,y)的特徵值λ1λ2λ1、λ2決定的,橢賀的方向是由M(x,y)M(x,y)的特徵矢量決定的,如下圖所示,橢圓方程爲:

[Δx,Δy]M(x,y)[ΔxΔy]=1[Δx,Δy]M(x,y)[ΔxΔy]=1

image

橢圓函數特徵值與圖像中的角點、直線(邊緣)和平面之間的關係如下圖所示。共可分爲三種情況:

  • 圖像中的直線。一個特徵值大,另一個特徵值小,λ1λ2λ1≫λ2λ2λ1λ2≫λ1。自相關函數值在某一方向上大,在其他方向上小。
  • 圖像中的平面。兩個特徵值都小,且近似相等;自相關函數數值在各個方向上都小。
  • 圖像中的角點。兩個特徵值都大,且近似相等,自相關函數在所有方向都增大。

    image

根據二次項函數特徵值的計算公式,我們可以求M(x,y)M(x,y)矩陣的特徵值。但是Harris給出的角點差別方法並不需要計算具體的特徵值,而是計算一個角點響應值RR來判斷角點。RR的計算公式爲:

R=detMα(traceM)2R=detM−α(traceM)2

式中,detMdetM爲矩陣M=[ABBC]M=[ABBC]的行列式;traceMtraceM爲矩陣MM的直跡;αα爲經常常數,取值範圍爲0.04~0.06。事實上,特徵是隱含在detMdetMtraceMtraceM中,因爲,

detM=λ1λ2=ACB2detM=λ1λ2=AC−B2

traceM=λ2+λ2=A+CtraceM=λ2+λ2=A+C

2.2 Harris角點算法實現

根據上述討論,可以將Harris圖像角點檢測算法歸納如下,共分以下五步:

1. 計算圖像I(x,y)I(x,y)XXYY兩個方向的梯度IxIyIx、Iy

Ix=Ix=I(1 0 1)Iy=Ix=I(1 0 1)TIx=∂I∂x=I⊗(−1 0 1),Iy=∂I∂x=I⊗(−1 0 1)T

2. 計算圖像兩個方向梯度的乘積。

I2x=IxIyI2y=IyIyIxy=IxIyIx2=Ix⋅Iy,Iy2=Iy⋅Iy,Ixy=Ix⋅Iy

3. 使用高斯函數對I2xI2yIxyIx2、Iy2和Ixy進行高斯加權(取σ=1σ=1),生成矩陣MM的元素ABA、BCC

A=g(I2x)=I2xwC=g(I2y)=I2ywB=g(Ix,y)=IxywA=g(Ix2)=Ix2⊗w,C=g(Iy2)=Iy2⊗w,B=g(Ix,y)=Ixy⊗w

4. 計算每個像素的Harris響應值RR,並對小於某一閾值ttRR置爲零。

R={R:detMα(traceM)2<t}R={R:detM−α(traceM)2<t}

5. 在3×33×35×55×5的鄰域內進行非最大值抑制,局部最大值點即爲圖像中的角點。

Harris角點檢測的C++實現代碼:https://github.com/RonnyYoung/ImageFeatures/blob/master/source/harris.cpp

2.3 Harris角點的性質

1. 參數αα對角點檢測的影響

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

detM=iλi      traceM=iλidetM=∏iλi      traceM=∑iλi

從而可以得到角點的響應

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

假設R0R≥0,則有:

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

對於較小的kk值,Rλ2(kα),α<kR≈λ2(k−α),α<k

由此,可以得出這樣的結論:增大αα的值,將減小角點響應值RR,降低角點檢測的靈性,減少被檢測角點的數量;減小αα值,將增大角點響應值RR,增加角點檢測的靈敏性,增加被檢測角點的數量。

2. Harris角點檢測算子對亮度和對比度的變化不敏感

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

image image

3. Harris角點檢測算子具有旋轉不變性

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

4. Harris角點檢測算子不具有尺度不變性

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

image

2.4 Harris的OpenCV接口

OpenCV的Hairrs角點檢測的函數爲cornerHairrs(),但是它的輸出是一幅浮點值圖像,浮點值越高,表明越可能是特徵角點,我們需要對圖像進行閾值化。

C++: void cornerHarris(InputArray src, OutputArray dst, int blockSize, int apertureSize, double k, int borderType = BORDER_DEFAULT);
  • src – 輸入的單通道8-bit或浮點圖像。
  • dst – 存儲着Harris角點響應的圖像矩陣,大小與輸入圖像大小相同,是一個浮點型矩陣。
  • blockSize – 鄰域大小。
  • apertureSize – 擴展的微分算子大。
  • k – 響應公式中的,參數αα
  • boderType – 邊界處理的類型。
int main()
{
    Mat image = imread("../buliding.png");
    Mat gray;
    cvtColor(image, gray, CV_BGR2GRAY);

    Mat cornerStrength;
    cornerHarris(gray, cornerStrength, 3, 3, 0.01);
    threshold(cornerStrength, cornerStrength, 0.001, 255, THRESH_BINARY);
    return 0;
}

 

  image     image   image

從上面上間一幅圖像我們可以看到,有很多角點都是粘連在一起的,我們下面通過加入非極大值抑制來進一步去除一些粘在一起的角點。

非極大值抑制原理是,在一個窗口內,如果有多個角點則用值最大的那個角點,其他的角點都刪除,窗口大小這裏我們用3*3,程序中通過圖像的膨脹運算來達到檢測極大值的目的,因爲默認參數的膨脹運算就是用窗口內的最大值替代當前的灰度值。

int main()
{
    Mat image = imread("buliding.png");
    Mat gray;
    cvtColor(image, gray, CV_BGR2GRAY);

    Mat cornerStrength;
    cornerHarris(gray, cornerStrength, 3, 3, 0.01);

    double maxStrength;
    double minStrength;
    // 找到圖像中的最大、最小值
    minMaxLoc(cornerStrength, &minStrength, &maxStrength);

    Mat dilated;
    Mat locaMax;
    // 膨脹圖像,最找出圖像中全部的局部最大值點
    dilate(cornerStrength, dilated, Mat());
    // compare是一個邏輯比較函數,返回兩幅圖像中對應點相同的二值圖像
    compare(cornerStrength, dilated, locaMax, CMP_EQ);

    Mat cornerMap;
    double qualityLevel = 0.01;
    double th = qualityLevel*maxStrength; // 閾值計算
    threshold(cornerStrength, cornerMap, th, 255, THRESH_BINARY);
    cornerMap.convertTo(cornerMap, CV_8U);
    // 逐點的位運算
    bitwise_and(cornerMap, locaMax, cornerMap);

    drawCornerOnImage(image, cornerMap);
    namedWindow("result");
    imshow("result", image);
    waitKey();

    return 0;
}
void drawCornerOnImage(Mat& image, const Mat&binary)
{
    Mat_<uchar>::const_iterator it = binary.begin<uchar>();
    Mat_<uchar>::const_iterator itd = binary.end<uchar>();
    for (int i = 0; it != itd; it++, i++)
    {
        if (*it)
            circle(image, Point(i%image.cols, i / image.cols), 3, Scalar(0, 255, 0), 1);
    }
}

現在我們得到的效果就比默認的函數得到的結果有相當的改善,如上面最右邊效果圖。

3. 多尺度Harris角點

3.1 多尺度Harris角點的原理

雖然Harris角點檢測算子具有部分圖像灰度變化的不變性和旋轉不變性,但它不具有尺度不變性。但是尺度不變性對圖像特徵來說至關重要。人們在使用肉眼識別物體時,不管物體遠近,尺寸的變化都能認識物體,這是因爲人的眼睛在辨識物體時具有較強的尺度不變性。在圖像特徵提取:尺度空間理論這篇文章裏就已經講到了高斯尺度空間的概念。下面將Harris角點檢測算子與高斯尺度空間表示相結合,使用Harris角點檢測算子具有尺度的不變性。

仿照Harris角點檢測中二階矩的表示方法,使用M=μ(x,σI,σD)M=μ(x,σI,σD)爲尺度自適應的二階矩:

M=μ(x,σI,σD)=σ2Dg(σI)[L2x(x,σD)LxLy(x,σD)LxLy(x,σD)L2y(x,σD)]M=μ(x,σI,σD)=σD2g(σI)⊗[Lx2(x,σD)LxLy(x,σD)LxLy(x,σD)Ly2(x,σD)]

其中,g(σI)g(σI)表示尺度爲sigmaIsigmaI的高斯卷積核,xx表示圖像的位置。與高斯測度空間類似,使用L(x)L(x)表示經過高斯平滑後的圖像,符號表示卷積,Lx(x,σD)Lx(x,σD)Ly(x,σD)Ly(x,σD)表示對圖像使用高斯g(σD)g(σD)函數進行平滑後,在xxyy方向取其微分的結果,即Lx=xLLx=∂xLLy=yLLy=∂yL。通常將σIσI稱爲積分尺度,它是決定Harris角點當前尺度的變量,σDσD爲微分尺度或局部尺度,它是決定角點附近微分值變化的變量。顯然,積分尺度σIσI應該大於微分尺度σDσD

3.2 多尺度Harris角點實現

首先,檢測算法從預先定義的一組尺度中進行積分尺度搜索,這一組尺度定義爲

σ1σn=σ0knσ0σ1…σn=σ0…knσ0

一般情況下使用k=1.4。爲了減少搜索的複雜性,對於微分尺度σDσD的選擇,我們採用在積分尺度的基礎上,乘以一個比例常數,即σD=sσIσD=sσI,一般取s=0.7。這樣,通常使用積分和微分的尺度,便可以生成μ(x,σI,σD)μ(x,σI,σD),再利用Harris角點判斷準則,對角點進行搜索,具體可以分兩步進行。

1. 與Harris角點搜索類似,對於給定的尺度空間值σDσD,進行如下角點響應值計算和判斷:

cornerness=det(μ(x,σn)αtrace2(μ(x,σn)))>thresholdHcornerness=det(μ(x,σn)−αtrace2(μ(x,σn)))>thresholdH

2. 對於滿足1中條件的點,在點的8鄰域內進行角點響應最大值搜索(即非最大值抑制)出在8鄰域內角點響應最大值的點。對於每個尺度σn(1,2,,n)σn(1,2,…,n)都進行如上搜索。

由於位置空間的候選點並不一定在尺度空間上也能成爲候選點,所以,我們還要在尺度空間上進行搜索,找到該點的所謂特徵尺度值。搜索特徵尺度值也分兩步。

1. 對於位置空間搜索到的每個候選點,進行拉普拉斯響應計算,並滿足其絕對值大於給定的閾值條件:

F(x,σn)=σ2n|Lxx(x,σn)+Lyy(x,σn)|thresholdLF(x,σn)=σn2|Lxx(x,σn)+Lyy(x,σn)|≥thresholdL

2. 與鄰近的兩個尺度空間的拉普拉斯響應值進行比較,使其滿足:

F(x,σn)>F(x,σl),   l{n1.n+1}F(x,σn)>F(x,σl),   l∈{n−1.n+1}

滿足上述條件的尺度值就是該點的特徵尺度值。這樣,我們就找到了在位置空間和尺度空間都滿足條件的Harris角點。

多尺度Harris角點檢測C++實現:https://github.com/RonnyYoung/ImageFeatures/blob/master/source/harrisLaplace.cpp

4. 更多的討論

在上面描述的Harris角點具有光照不變性、旋轉不變性、尺度不變性,但是嚴格意義上來說並不具備仿射不變性。Harris-Affine是一種新穎的檢測仿射不變特徵點的方法,可以處理明顯的仿射變換,包括大尺度變化和明顯的視角變化。Harris-Affine主要是依據了以下三個思路:

  1. 特徵點周圍的二階矩的計算對區域進行的歸一化,具有仿射不變性;
  2. 通過在尺度空間上歸一化微分的局部極大值求解來精化對應尺度;
  3. 自適應仿射Harris檢測器能夠精確定位牲點;

這篇文章不對Harris-Affine作進一步的描述,有時間會對這一算法做專門的分析,有興趣的可以參考原論文:Scale & Affine Invariant Interest Point Detectors.

5. 參考資料

[1] 《圖像局部不變特徵與描述》王永明,王貴錦。

[2] Harris角點及Shi-Tomasi角點檢測

[3] 圖像特徵提取PPT

[4] Harris角點檢測算法 1

[5] OpenCV Harris角點檢測

[6] Opencv學習筆記(五)Harris角點檢測


=================================【Harris角點檢測原理分析】=======================================


 點我進入原文


主要參考了:http://blog.csdn.net/yudingjun0611/article/details/7991601  Harris角點檢測算子

本文將該文拷貝了過來,並做了一些數學方面的補充,以方便對數學已經生疏的小夥伴們參考理解。由於補充的內容還挺多,所以還是將本文標註爲了原創。

我增加的部分在文中用 {{  }} 圈了起來並用紅色字體標註。

正文開始。


Harris角點檢測算子是於1988年由CHris Harris & Mike Stephens提出來的。在具體展開之前,不得不提一下Moravec早在1981就提出來的Moravec角點檢測算子。

1.Moravec角點檢測算子

        Moravec角點檢測算子的思想其實特別簡單,在圖像上取一個W*W的“滑動窗口”,不斷的移動這個窗口並檢測窗口中的像素變化情況E。像素變化情況E可簡單分爲以下三種:A  如果在窗口中的圖像是什麼平坦的,那麼E的變化不大。B  如果在窗口中的圖像是一條邊,那麼在沿這條邊滑動時E變化不大,而在沿垂直於這條邊的方向滑動窗口時,E的變化會很大。 C  如果在窗口中的圖像是一個角點時,窗口沿任何方向移動E的值都會發生很大變化。

上圖就是對Moravec算子的形象描述。用數學語言來表示的話就是:

其中(x,y)就表示四個移動方向(1,0)(1,1)(0,1)(-1,1),E就是像素的變化值。Moravec算子對四個方向進行加權求和來確定變化的大小,然和設定閾值,來確定到底是邊還是角點。

 

2.Harris角點檢測算子

        Harris角點檢測算子實質上就是對Moravec算子的改良和優化。在原文中,作者提出了三點Moravec算子的缺陷並且給出了改良方法:

1.  Moravec算子對方向的依賴性太強,在上文中我們可以看到,Moravec算子實際上只是移動了四個45度角的離散方向,真正優秀的檢測算子應該能考慮到各個現象的移動變化情況。爲此,作者採用微分的思想(這裏不清楚的話可以複習下高數中的全微分):

其中:

 

 

所以E就可以表示爲:

2.由於Moravec算子採用的是方形的windows,因此的E的響應比較容易受到干擾,Harris採用了一個較爲平滑的窗口——高斯函數:

3.Moravec算子對邊緣響應過於靈敏。爲此,Harris提出了對E進行變形:

對,沒錯,變成了二次型,果然是大牛,更牛的還在後面!其中,

用α,β表示矩陣M的特徵值,這樣會產生三種情況:A  如果α,β都很小,說明高斯windows中的圖像接近平坦。 B  如果一個大一個小,則表示檢測到邊。 C  如果α,β都很大,那麼表示檢測到了角點。

α,β是什麼?α,β就是橢圓的長短軸的度量,什麼?橢圓哪裏來?橢圓就是那個二次型函數來的!下圖的意思我就不詳細講解了,相信大家能懂。

{{

轉載注:NewThinker_wei:

關於矩陣知識的一點補充:好長時間沒看過線性代數的話,這一段比較難理解。可以看到M是實對稱矩陣,這裏簡單溫習一下實對稱矩陣和二次型的一些知識點吧。

1. 關於特徵值和特徵向量:

特徵值的特徵向量的概念忘了就自己查吧,這裏只說關鍵的。對於實對稱矩陣M(設階數爲n),則一定有n個實特徵值,每個特徵值對應一組特徵向量(這組向量中所有向量共線),不同特徵值對應的特徵向量間相互正交;(注意這裏說的是實對稱矩陣,不是所有的矩陣都滿足這些條件)

2. 關於對角化:

對角化是指存在一個正交矩陣Q,使得  Q’MQ 能成爲一個對角陣(只有對角元素非0),其中Q’是Q的轉置(同時也是Q的逆,因爲正交矩陣的轉置就是其逆)。一個矩陣對角化後得到新矩陣的行列式和矩陣的跡(對角元素之和)均與原矩陣相同。如果M是n階實對稱矩陣,則Q中的第 j 列就是第 j 個特徵值對應的一個特徵向量(不同列的特徵向量兩兩正交)。

3. 關於二次型:

對於一個n元二次多項式,f(x1,x2....xn) = ∑ ( aij*xi*xj ) ,其中 i 和 j 的求和區間均爲 [1,n] ,

可將其各次的係數 aij 寫成一個n*n矩陣M,由於 aij 和 aji 的對稱等價關係,一般將 aij 和 aji 設爲一樣的值,均爲 xi*xj 的係數的二分之一。這樣,矩陣M就是實對稱矩陣了。即二次型的矩陣默認都是實對稱矩陣

4. 關於二次型的標準化(正交變換法):

二次型的標準化是指通過構造一個n階可逆矩陣 C,使得向量 ( x1,x2...xn ) = C * (y1,y2...yn),把n維向量 x 變換成n維向量 y ,並代入f(x1,x2....xn) 後得到 g(y1,y2...yn),而後者的表達式中的二次項中不包含任何交叉二次項 yi*yj(全部都是平方項 yi^2),也即表達式g的二次型矩陣N是對角陣。用公式表示一下 f 和 g ,(下面的表達式中 x 和 y都代表向量,x' 和 y' 代表轉置)

f = x' * M * x ;

g = f = x' * M * x = (Cy)' * M * (Cy) = y' * (C'MC) * y = y' * N * y  ;

因此 C‘MC = N。正交變換法,就是直接將M對角化得到N,而N中對角線的元素就是M的特徵值。正交變換法中得到的 C 正好是一個正交矩陣,其每一列都是兩兩正交的單位向量,因此 C 的作用僅僅是將座標軸旋轉(不會有放縮)。 


OK,基礎知識補充完了,再來說說Harris角點檢測中的特徵值是怎麼回事。這裏的 M 是


將M對角化後得到矩陣N,他們都是2階矩陣,且N的對角線元素就是本文中提到的 α 和 β。

本來 E(x,y) = A*x^2 + 2*C*x*y + B*y^2 ,而將其標準後得到新的座標 xp和yp,這時表達式中就不再含有交叉二次項,新表達式如下:

 E(x,y) = Ep (xp,yp) = α*xp^2 + β*yp^2,

我們不妨畫出 Ep (xp,yp) = 1 的等高線L ,即

 α*xp^2 + β*yp^2 = 1 ,

可見這正好是(xp,yp)空間的一個橢圓,而α 和 β則分別是該橢圓長、短軸平方的倒數(或者反過來),且長短軸的方向也正好是α 和 β對應的特徵向量的方向。由於(x,y)空間只是 (xp,yp)空間的旋轉,沒有放縮,因此等高線L在(x,y)空間也是一個全等的橢圓,只不過可能是傾斜的。

現在就能理解下面的圖片中出現的幾個橢圓是怎麼回事了,圖(a)中畫的正是高度爲 1 的等高線,(其他”高度“處的等高線也是橢圓,只不過長短軸的長度還要乘以一個係數)。其他的幾幅圖片中可以看到,“平坦”區域由於(高度)變化很慢,等高線(橢圓)就比較大;而”邊緣“區域則是在一個軸向上高度變化很快,另一個與之垂直的軸向上高度變化很慢,因此一個軸很長一個軸很短;“角點”區域各個方向高度都變化劇烈,因此橢圓很小我們人眼可以直觀地看到橢圓的大小胖瘦,但如何讓計算機識別這三種不同的幾何特徵呢?爲了能區分出角點、邊緣和平坦區域我們現在需要用α 和 β構造一個特徵表達式,使得這個特徵式在三種不同的區域有明顯不同的值。一個表現還不錯的特徵表達式就是:

(αβ) - k(α+β)^2

表達式中的 k 的值怎麼選取呢?它一般是一個遠小於 1 的係數,OpenCV的默認推薦值是 0.04(=0.2的平方),它近似地表達了一個閾值:當橢圓短、長軸的平方之比(亦即α 和 β兩個特徵值之比)小於這個閾值時,認爲該橢圓屬於“一個軸很長一個軸很短”,即對應的點會被認爲是邊緣區域。

對於邊緣部分,(假設較大的特徵值爲β)由於 β>>αα<kβ,因此特徵式 :

(αβ) - k(α+β)^2 ≈ αβ - kβ^2  <  (kβ)β - kβ^2 = 0

即邊緣部分的特徵值小於0 ;

對於非邊緣部分,α 和 β相差不大,可認爲 (α+β)^2 ≈ 4αβ,因此特徵式:

(αβ) - k(α+β)^2 ≈ αβ - 4kαβ =  ( 1 - 4k ) * αβ

由於 k 遠小於1,因此 1 - 4k ≈ 1,這樣特徵式進一步近似爲:

(αβ) - k(α+β)^2 ≈  αβ

在角點區域,由於α 和 β都較大,對應的特徵式的值也就很大;而在平坦區域,特徵式的值則很小。


因此,三種不同區域的判別依據就是: 如果特徵表達式的值爲負,則屬於邊緣區域;如果特徵表達式的值較大,則屬於角點區域;如果特徵表達式的值很小,則是平坦區域。

最後,由於αβ和(α+β)正好是M對角化後行列式和跡,再結合上面補充的基礎知識第2條中提到的行列式和跡在對角化前後不變,就可以得到 (αβ) - k(α+β)^2 = det(M) - k*Tr(M)^2,這就是Harris檢測的表達式。


轉載註解完畢,下面接原文。

}}

有人又要問了,你怎麼知道我檢測到α,β算大還是算小?對此天才哈里斯定義了一個角點響應函數:

其中(這些都是線性代數裏的知識):

我們驚喜的發現,R爲正值是,檢測到的是角點,R爲負時檢測到的是邊,R很小時檢測到的是平坦區域。至於他怎麼想出來的,我就不得而知了......

 Harris角點檢測算法有諸多優點:A  旋轉不變性,橢圓轉過一定角度但是其形狀保持不變(特徵值保持不變)

B  對於圖像灰度的仿射變化具有部分的不變性,由於僅僅使用了圖像的一介導數,對於圖像灰度平移變化不變;對於圖像灰度尺度變化不變

當然Harris也有許多不完善的地方:A  它對尺度很敏感,不具備幾何尺度不變性。

 

B  提取的角點是像素級的。以至於後來又有許多牛人提出了更多更完善的檢測算子,且聽下回分解!





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章