這個算子算是圖像歷史上第一個特徵點提取算法了,1977年提出的,很簡單,拿來練手很合適。算法
算法原理以下:spa
1.選取一個合理的鄰域遍歷圖像,這裏是5*5鄰域的。在鄰域中依次計算,垂直,水平,對角與反對角四個相鄰像素灰度的差的平方和,做爲該鄰域特徵值。3d
大體就是下面這個樣子:code
公式:blog
這裏k是窗口的半徑。class
2.從四個特徵值中選最小的值做爲該像素初次候選特徵值。原理
公式:遍歷
3.設定一個閾值,將大於該閾值初次候選特徵值的選爲二次候選特徵值。im
4.設定一個鄰域,將該鄰域最大的二次候選特徵值做爲最終要選擇的特徵值。margin
原圖:
處理後:
matlab代碼以下:
clear all;close all;clc img=double(imread('lena.jpg')); [h w]=size(img); imshow(img,[]) imgn=zeros(h,w); n=4; for y=1+n:h-n for x=1+n:w-n sq=img(y-n:y+n,x-n:x+n); V=zeros(1,4); for i=2:2*n+1 %垂直,水平,對角,反對角四個方向領域灰度差的平方和 V(1)=V(1)+(sq(i,n+1)-sq(i-1,n+1))^2; V(2)=V(2)+(sq(n+1,i)-sq(n+1,i-1))^2; V(3)=V(3)+(sq(i,i)-sq(i-1,i-1))^2; V(4)=V(4)+(sq(i,(2*n+1)-(i-1))-sq(i-1,(2*n+1)-(i-2)))^2; end pix=min(V); %四個方向中選最小值 imgn(y,x)=pix; end end T=mean(imgn(:)); %設閾值,小於均值置零 ind=find(imgn<T); imgn(ind)=0; for y=1+n:h-n %選局部最大且非零值做爲特徵點 for x=1+n:w-n sq=imgn(y-n:y+n,x-n:x+n); if max(sq(:))==imgn(y,x) && imgn(y,x)~=0 img(y,x)=255; end end end figure; imshow(img,[]);
算法整個過程仍是很簡單的,練習一下,順便祭下這個特徵值開山算法。