Harris角點檢測——python實現

1.實驗原理

1.1什麼是角點

角點就是極值點,即在某方面屬性特別突出的點,是在某些屬性上強度最大或者最小的孤立點、線段的終點。而對於圖像而言,如圖所示紅點部分,即爲圖像的角點,其是物體輪廓線的連接點。
因此,在角點時,窗口向任意方向的移動都導致圖像灰度的明顯變化。
在這裏插入圖片描述

1.2數學表達

假設圖像像素點(x,y)的灰度爲 I(x,y),以像素點爲中心的窗口沿 x 和 y 方向分別移動 u 和 v 的灰度強度變化的表達式爲:
在這裏插入圖片描述
其中 E(u,v)是灰度變化,w(x,y) 是窗口函數,一般是高斯函數,所以可以把w(x,y)看做是高斯濾波器。I(x,y)是圖像灰度, I(x+u,y+v)是平移後的圖像灰度。
收到泰勒公式的啓發,在這裏我們可以將 I(x+u,y+v)函數在(x,y)處泰勒展開,爲了提高抗干擾的能力並且簡化運算,我們取到了一階導數部分,後面的無窮小量可以忽略,整理得到表達式如下:
在這裏插入圖片描述
將[ Ixu+Iyv ]展開後整理可以用矩陣表達爲:
在這裏插入圖片描述

最後我們可以近似得到E(x,y)的表達式,將其化爲二次型後得到:
在這裏插入圖片描述
其中M是一個2X2的矩陣,稱爲像素點的自相關矩陣,可以由圖像的導數求得。M=窗口函數*偏導矩陣,表達式爲:
在這裏插入圖片描述

因爲u,v是局部微小的移動變量,所以我們對M進行討論,M是一個2X2的矩陣,M的表達式中與點的位置(x,y)具體強相關性,記M得特徵值爲λ1,λ2,關於特徵值的意義太過抽象,這裏就不展開,但是我們可以簡單理解爲該點的灰度值變化速度,那麼a1和a2可以分別看做是x方向和y方向的灰度變化速率,就可以用a1,a2兩者的大小關係來進行分類。
當兩個特徵值λ1和λ2都偏小的時候,表示窗口沿任意方向移動都會使灰度變化很細微,該點處於圖像的平坦區域。
當λ1>>λ2或者λ1<<λ2時,說明該點向水平(垂直)方向移動時變化會很明顯,而向垂直(水平)方向則變化不明顯,該點處於圖像的邊緣區。
當兩個特徵值λ1和λ2都很大的時候,表示窗口沿任意方向移動都會使灰度變化很明顯,該點位置就是圖像角點的位置。
在這裏插入圖片描述

然而在實際中,經常使用的是角點響應函數CRF這一概念,以此更加準確的計算所需角點,方法如下:

在這裏插入圖片描述
det M是矩陣M的行列式,Trace(M)爲矩陣M的跡。k爲修正值,是一個常數,經驗取值爲0.04-0.06。算出響應值之後,根據R與閾值T的比較來判斷是否爲角點。

當|R|很小時,R<T , 認爲該點處於圖像的平坦區域。
當R<0時,R<T , 認爲該點處於圖像的邊緣區。
當R>0時,R>T, 認爲該點位置就是圖像角點。

在這裏插入圖片描述

2.實驗代碼

compute_harris_response():在一幅灰度圖像中,對每個像素計算harris角點檢測器響應函數,返回像數值爲Harris響應值的一幅圖像
get_harris_points():從一幅harris響應圖像中返回角點

# -*- coding: utf-8 -*-
from pylab import *
from PIL import Image
from PCV.localdescriptors import harris

"""
Example of detecting Harris corner points (Figure 2-1 in the book).
"""

# 讀入圖像
im = array(Image.open(r'C:\Python\Pictrue\group5_5.jpg').convert('L'))

# 檢測harris角點

harrisim = harris.compute_harris_response(im)

# Harris響應函數
harrisim1 = 255 - harrisim

figure()
gray()

#畫出Harris響應圖
subplot(141)
imshow(harrisim1)
print harrisim1.shape
axis('off')
axis('equal')

threshold = [0.01, 0.05, 0.1]
for i, thres in enumerate(threshold):
    filtered_coords = harris.get_harris_points(harrisim, 6, thres)
    subplot(1, 4, i+2)
    imshow(im)
    print im.shape
    plot([p[1] for p in filtered_coords], [p[0] for p in filtered_coords], '*')
    axis('off')

#原書採用的PCVPCV harris模塊
#harris.plot_harris_points(im, filtered_coords)

# plot only 200 strongest
# harris.plot_harris_points(im, filtered_coords[:200])

show()

3.實驗結果及分析

3.1邊緣多的場景

3.1.1正面亮

在這裏插入圖片描述
在這裏插入圖片描述

3.1.2正面暗

在這裏插入圖片描述

在這裏插入圖片描述

3.1.3正面遠

在這裏插入圖片描述
在這裏插入圖片描述

3.1.4旋轉

在這裏插入圖片描述
在這裏插入圖片描述

3.1.5 側面

在這裏插入圖片描述
在這裏插入圖片描述

3.1.6結論

在邊緣多的場景中
(1)亮度:亮度較高的圖片角點較多
(2)旋轉:無太大變化
(3)正面側面:無太大變化
(4)遠近:無太大變化

3.2角點豐富的場景

3.2.1正面近

在這裏插入圖片描述
在這裏插入圖片描述

3.2.2正面亮

在這裏插入圖片描述
在這裏插入圖片描述

3.2.3正面暗

在這裏插入圖片描述
在這裏插入圖片描述

3.2.4旋轉

在這裏插入圖片描述
在這裏插入圖片描述

3.2.5側面

在這裏插入圖片描述
在這裏插入圖片描述

3.2.6結論

在角點豐富的場景中
(1)亮度:亮度較低的圖片與亮度較高的圖片相比角點更多
(2)旋轉:圖片的旋轉對角點沒有太大影響
(3)正面側面:圖片的正側面對角點沒有太大影響
(4)遠近:遠圖角點較近圖角點多

3.3紋理平坦的場景

3.3.1正面近

在這裏插入圖片描述
在這裏插入圖片描述

3.3.2正面亮

在這裏插入圖片描述
在這裏插入圖片描述

3.3.3正面暗

在這裏插入圖片描述
在這裏插入圖片描述

3.3.4旋轉

在這裏插入圖片描述
在這裏插入圖片描述

3.3.5側面

在這裏插入圖片描述
在這裏插入圖片描述

3.3.6結論

在平坦的場景中
(1)亮度:亮度較高的圖片角點較多
(2)遠近:無較大變化
(3)旋轉:無較大變化
(4)正側面:無較大變化

4.總結論

由上述得出以下結論:角點檢測算子對亮度的變化更敏感敏感,角點更多,角點算子具有旋轉不變性,正側面對角點並沒有太大影響,但是角點不具備尺度不變性。
平坦場景下角點變化很微小,邊緣豐富場景下沿着邊緣方向移動不會出現太大變化,角點多的情況下較其他兩種情況會出現較大變化。
同時有一個疑問沒有解決:有一些圖片放進去會出現不顯示角點的情況,並且有runtime error,在網上找到的和我的情況都不是很符合,於是我就換了能用的圖片繼續實驗。

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