天天看點

MATLAB Moravec算子

這個算子算是圖像曆史上第一個特征點提取算法了,1977年提出的,很簡單,拿來練手很合适。

算法原理如下:

1.選取一個合理的鄰域周遊圖像,這裡是5*5鄰域的。在鄰域中依次計算,垂直,水準,對角與反對角四個相鄰像素灰階的差的平方和,作為該鄰域特征值。

大緻就是下面這個樣子:

MATLAB Moravec算子
公式:
MATLAB Moravec算子
MATLAB Moravec算子
MATLAB Moravec算子
MATLAB Moravec算子

這裡k是視窗的半徑。

2.從四個特征值中選最小的值作為該像素初次候選特征值。

MATLAB Moravec算子

3.設定一個門檻值,将大于該門檻值初次候選特征值的選為二次候選特征值。

4.設定一個鄰域,将該鄰域最大的二次候選特征值作為最終要選擇的特征值。

原圖:

MATLAB Moravec算子
處理後:

1 clear all;close all;clc
 2 
 3 img=double(imread('lena.jpg'));
 4 [h w]=size(img);
 5 imshow(img,[])
 6 
 7 imgn=zeros(h,w);
 8 n=4;
 9 for y=1+n:h-n
10    for x=1+n:w-n
11        sq=img(y-n:y+n,x-n:x+n);
12        V=zeros(1,4);
13        for i=2:2*n+1        %垂直,水準,對角,反對角四個方向領域灰階差的平方和
14             V(1)=V(1)+(sq(i,n+1)-sq(i-1,n+1))^2;
15             V(2)=V(2)+(sq(n+1,i)-sq(n+1,i-1))^2;
16             V(3)=V(3)+(sq(i,i)-sq(i-1,i-1))^2;
17             V(4)=V(4)+(sq(i,(2*n+1)-(i-1))-sq(i-1,(2*n+1)-(i-2)))^2;
18        end
19        pix=min(V);          %四個方向中選最小值
20        imgn(y,x)=pix;      
21    end
22 end
23 
24 T=mean(imgn(:));        %設門檻值,小于均值置零
25 ind=find(imgn<T);
26 imgn(ind)=0;
27 
28 for y=1+n:h-n           %選局部最大且非零值作為特征點
29     for x=1+n:w-n
30         sq=imgn(y-n:y+n,x-n:x+n);
31         if max(sq(:))==imgn(y,x) && imgn(y,x)~=0
32             img(y,x)=255;
33         end
34     end
35 end
36 
37 figure;
38 imshow(img,[]);