(二)計算機視覺--Harris角點檢測

目錄

一、Harris角點檢測

1.1 算法思想

1.2 數學模型

二、不同場景圖片對實驗實驗影響

2.1 紋理平坦的圖片

2.2 邊緣多的圖片

2.3 角點豐富的圖片

三、實驗代碼

四、總結

 


一、Harris角點檢測

1.1 算法思想

       角點原理來源於人對角點的感性判斷,即圖像在各個方向灰度有明顯變化。算法的核心是利用局部窗口在圖像上進行移動判斷灰度發生較大的變化,所以此窗口用於計算圖像的灰度變化。

       根據下面三幅圖可以清晰理解角點檢測的過程:當一個窗口在圖像上移動,如下第一個圖,窗口在各個方向上都沒有變化,則認爲窗口區域爲平滑區域。如第二個圖,窗口在某個方向上沒有變化,另一個方向上有明顯變化,那麼,這塊區域可能存在邊緣。如第三個圖,窗口在各個方向上灰度發生了較大的變化,那麼,這塊區域可能存在角點。Harris角點檢測正是利用了這個直觀的物理現象,通過窗口在各個方向上的變化程度,決定是否爲角點。
 

               

 

1.2 數學模型

     根據算法思想,構建數學模型,計算移動窗口的的灰度差值。

角點響應函數R定義爲:R=det M-k(traceM)^{2}

其中 det M=\lambda _{1}\lambda _{2}    ,traceM=\lambda _{1}+\lambda _{2}

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

 

 

二、不同場景圖片對實驗實驗影響

 

2.1 紋理平坦的圖片

   實驗結果顯示了四張圖片,分別爲harris響應圖,以及threshold爲0.01、0.05和0.1檢測出的角點圖片。

2.1.1 正面

實驗結果:

 

2.1.2 側面

實驗結果:

2.1.3旋轉

2.1.4 尺度變化

近距離:

遠距離:

2.1.5 分析

      平坦區的R值爲小數值,在遠距離檢測到的角點比較近距離的焦點要多,在相同閾值下側面檢測到的點比正面的點多

,旋轉的圖片也能夠檢測出相同區域的角點,變化並不是很大。

2.2 邊緣多的圖片

2.2.1 正面

實驗結果:

2.2.2 側面

實驗結果:

2.2.3 旋轉

實驗結果:

2.2.4 尺度變化

近距離:

遠距離:

 

2.2.5 分析

     由角點響應函數R:R=det M-k(traceM)^{2}   我們可以知道,閾值(k)越大,檢測的響應越少,標記出來的點的數量越少,閾值小檢測的點越多。由實驗結果可以看到旋轉對檢測結果的影響並不大,正面檢測到的點旋轉之後還是能檢測到相同的點;側面檢測到的點比較多,可能也有光線的一部分原因,範圍很大;遠距離下檢測出的角點相比於近距離更多。

 

2.3 角點豐富的圖片

2.3.1 正面

實驗結果:

2.3.2 側面

實驗結果:

2.3.3 旋轉

實驗結果:

2.3.4 尺度變化

近距離:

遠距離:

2.3.5 分析

     R爲大數值正數的時候檢測爲角點,紋理角點比較豐富的場景下,圖片中的一個個的正方框,正面檢測檢測出很多的角點,但是在側面的時候發現隨着閾值的增加點比正面稍微少一點,旋轉的圖和正面檢測的點幾乎沒什麼變化,遠景的範圍比較大,一些在近景中以爲是邊緣的地方,在遠景中也有可能檢測爲角點,所以遠景的角點比較多。

 

三、實驗代碼

  不同場景下的圖片放到代碼運行得到結果

# -*- 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('C:/Users/asus/Pictures/window/Harris/Harris.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')


show()

 

四、總結

(1)Harris角點檢測本身具有旋轉不變性,從不同旋轉角度檢測出來的角點幾乎沒有變化的。

(2)Harris角點檢測中,遠景近景對實驗的影響還是比較大的,遠景檢測到的角點比較多,近景檢測到的角點就比較的少。因爲遠景的範圍比較大,在小範圍中一些部分區域的角點可能被認爲是邊緣,但是範圍放大的遠景就能檢測出是角點。

 

 

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