1. 程式人生 > >【區域性影象描述子】Harris角點檢測器

【區域性影象描述子】Harris角點檢測器

  1. 宣告:筆記來源於【python計算機視覺】一書。

    什麼是角點?

    1. 角點是一階導數(即灰度的梯度)的區域性最大所對應的畫素點;
    2. 角點是兩條及兩條以上邊緣的交點;
    3. 角點指示了物體邊緣變化不連續的方向;
    4. 角點處的一階導數最大,二階導數為0;

    Harris角點檢測演算法


數學推導

設影象視窗平移量為(u,v),產生的灰度變化為E(u,v),
E(u,v)=sum[w(x,y)[I(x+u,y+v)I(x,y)]2](1)

  • w(x,y)為視窗函式
  • I(x+u,y+v)為平移後的灰度值
  • I(x,y)為平移前的灰度值

有泰勒公式展開可得:

I(x+u,y+v)=I(

x,y)+Ixu+Iyv+O(u2,v2)(2)

  • Ix,Iy 分別為偏導數,在影象中為影象的方向導數。

E(u,v)=sum[w(x,y)[Ixu+Iyv+O(u2,v2)]2](3)

可以近似得到

E(u,v)=sum[w(x,y)[Ixu+Iyv]2](4)

E(u,v)=[u,v][Ix2IxIyIxIyIy2][uv](5)

M=[Ix2IxIyIxIyIy2](6)

因此最後對角點的檢測成了對矩陣M的特徵值的分析了,令M其特徵值為x1,x2;

  • 當x1>>x2或者x2>>x1,則檢測到的是邊緣部分;
  • 當x1,x2都很小,影象視窗在所有移動的方向上移動灰度級都無明顯變化.
  • 當X1,X2都很大時且相當,檢測到的是角點

程式設計時用x1,x2不方便,因此定義角點響應函式;
R=det(M)k(trace(M))2(7)

其中det(M)為矩陣M的行列式,trace(M)為矩陣M的

更具體數學公式實際程式設計的步驟

  1. 利用水平,豎直差分運算元對影象的每個畫素進行濾波以求得Ix,Iy,進而求得M中的四個元素的值。
    M=[Ix2IxIyIxIyIy2](6)
  2. 對M的四個元素進行高斯平滑濾波,為的是消除一些不必要的孤立點和凸起,得到新的矩陣M。

  3. 接下來利用M計算對應每個畫素的角點響應函式R,即:
    R=det(M)k(trace(M))2

    (7)
    也可以使用改進的R:
    R=Ix2Iy2(IxIy)2])/(Ix2+Iy2)(8)
    【Python計算機視覺】書中選用的是後一種方法計算角點的響應函式。

裡面沒有隨意給定的引數k,取值應當比第一個令人滿意。
4.在矩陣R中,同時滿足R(i,j)大於一定閾值threshold和R(i,j)是某領域內的區域性極大值,則被認為是角點。

完整程式碼

# -*- coding:utf-8 -*-
from PIL import Image
from numpy import *
from pylab import *
from scipy.ndimage import filters

def compute_harris_response(im, sigma=3):
    """ 在一幅灰度影象中,對每一個畫素計算Harris角點檢測器響應函式
     im:(陣列影象)  sigma=3:標準差為3
    """

    #計算x方向的導數