一、harris算法簡介
1.角點概述
角點是圖像很重要的特征,對圖像圖形的理解和分析有很重要的作用。角點在保留圖像圖形重要特征的同時,可以有效地減少信息的數據量,使其信息的含量很高,有效地提高了計算的速度,有利於圖像的可靠匹配,使得實時處理成為可能。從圖像分析的角度來定義角點可以有以下兩種定義:角點可以是兩個邊緣的角點;角點是鄰域內具有兩個主方向的特征點;
前者往往需要對圖像邊緣進行編碼,這在很大程度上依賴於圖像的分割與邊緣提取,具有相當大的難度和計算量,且一旦待檢測目標局部發生變化,很可能導致操作的失敗。基於圖像灰度的方法通過計算點的曲率及梯度來檢測角點,
避免了第一類方法存在的缺陷,此類方法主要有Moravec算子、Forstner算子、Harris算子、SUSAN算子等。本文主要介紹的Harris角點檢測的算法原理。
2.Harris角點檢測基本原理
人眼對角點的識別通常是在一個局部的小區域或小窗口完成的。如果在各個方向上移動這個特征的小窗口,窗口內區域的灰度發生了較大的變化,那么就認為在窗口內遇到了角點。如果這個特定的窗口在圖像各個方向上移動時,窗口內圖像的灰度沒有發生變化,那么窗口內就不存在角點;如果窗口在某一個方向移動時,窗口內圖像的灰度發生了較大的變化,而在另一些方向上沒有發生變化,那么,窗口內的圖像可能就是一條直線的線段。如下圖:
3、特征匹配流程
3.1、 根據准則,提取圖像中的特征點
3.2、提取特征點周圍的圖像塊,構造特征描述符
3.3、通過特征描述符對比,實現特征匹配
二、Harris角點檢測
聲明:為了更好地對 Harris角點檢測算法進行分析,本次實驗一共收集了紋理平坦、垂直邊緣多、垂直邊緣多的三個不同的場景,每個場景各收集了五幅的圖片。然后通過每個場景中正面、側面、旋轉、遠近、光照五個不同的方面進行對比試驗。
2.1、紋理平坦的場景(以書本為例)
2.1.1、正面圖及檢測結果
2.1.2、 側面圖及檢測結果
2.1.3、旋轉圖及檢測結果
2.1.4 、遠距離圖及檢測結果
2.1.5 、光照圖及檢測結果
實驗結果分析與總結:
Harris角點檢測算子具有旋轉不變性。在對同一物體不同角度圖片進行檢測時,Harris角點檢測算子使用的是角點附近的區域灰度二階矩矩陣。而二階矩矩陣可以表示成一個橢圓,橢圓的長短軸正是二階矩矩陣特征值平方根的倒數。當特征橢圓轉動時,特征值並不發生變化,所以判斷角點響應值也不發生變化,由此說明Harris角點檢測算子具有旋轉不變性。改變角度及旋轉拍攝對其影響不大,ksize較大時,檢測效果較差!
2.2垂直邊緣多的場景(以建築物為例)
2.2.1、正面圖及檢測結果
、
2.2.2、 側面圖及檢測結果
2.2.3、旋轉圖及檢測結果
2.2.4 、遠距離圖及檢測結果
2.2.5 、光照圖及檢測結果
實驗結果分析與總結:
通過在以上場景中從正面、側面、旋轉、遠近、光照五個不同的方面進行試驗得到的結果中可以看出,Harris角點檢測能較好地檢測出多個水平及垂直,改變角度及旋轉拍攝對其影響不大,ksize較大時,檢測效果較差,其結果還受圖片明暗程度的影響。但是由於拍攝不夠正規,結果不是特別明顯!
2.3、紋理角點豐富的場景
2.2.1、正面圖及檢測結果
2.2.2、 側面圖及檢測結果
2.2.3、旋轉圖及檢測結果
2.2.4 、遠距離圖及檢測結果
2.2.5 、光照圖及檢測結果
實驗結果分析與總結:
從以上結果圖對比可得,在紋理角點豐富的場景下,特征點提取過多,Harris角點檢測效果較差。對圖片的明暗程度比較敏感!
三、實驗小結
3.1特征點必須具有不變性,包括幾何不變性和關照不變性。幾何不變性包括旋轉和遠近等,關照不變性包括關照等。另外,特征點提取過多時,Harris角點檢測效果較差。
3.2能檢測出圖像中“真實的”角點、能准確的定位性能和具有不很高的穩定性的角點等是好的角點檢測算法
3.3Harris角點檢測的優點是穩定性高,尤其對L型角點(也就是直角)檢測精度高。其缺點是對圖片大小及圖片的明暗程度敏感。
四、代碼展示
# -*- 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:\Users\twz\Desktop\1.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') #原書采用的PCV中PCV harris模塊 #harris.plot_harris_points(im, filtered_coords) # plot only 200 strongest # harris.plot_harris_points(im, filtered_coords[:200]) show()