【區域性影象描述子】Harris角點檢測器
阿新 • • 發佈:2018-12-30
宣告:筆記來源於【python計算機視覺】一書。
什麼是角點?
- 角點是一階導數(即灰度的梯度)的區域性最大所對應的畫素點;
- 角點是兩條及兩條以上邊緣的交點;
- 角點指示了物體邊緣變化不連續的方向;
- 角點處的一階導數最大,二階導數為0;
Harris角點檢測演算法
數學推導
設影象視窗平移量為(u,v),產生的灰度變化為E(u,v),
有
- w(x,y)為視窗函式
- I(x+u,y+v)為平移後的灰度值
- I(x,y)為平移前的灰度值
有泰勒公式展開可得:
x,y)+Ix∗u+Iy∗v+O(u2,v2)(2)
- Ix,Iy 分別為偏導數,在影象中為影象的方向導數。
可以近似得到
即
令
因此最後對角點的檢測成了對矩陣M的特徵值的分析了,令M其特徵值為x1,x2;
- 當x1>>x2或者x2>>x1,則檢測到的是邊緣部分;
- 當x1,x2都很小,影象視窗在所有移動的方向上移動灰度級都無明顯變化.
- 當X1,X2都很大時且相當,檢測到的是角點。
程式設計時用x1,x2不方便,因此定義角點響應函式;
其中det(M)為矩陣M的行列式,trace(M)為矩陣M的跡。
更具體數學公式實際程式設計的步驟
- 利用水平,豎直差分運算元對影象的每個畫素進行濾波以求得Ix,Iy,進而求得M中的四個元素的值。
M=[Ix2Ix∗IyIx∗IyIy2](6) 對M的四個元素進行高斯平滑濾波,為的是消除一些不必要的孤立點和凸起,得到新的矩陣M。
接下來利用M計算對應每個畫素的角點響應函式R,即:
R=det(M)−k(trace(M))2
也可以使用改進的R:
R=(Ix2∗Iy2−(Ix∗Iy)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方向的導數