matlab練習程序(Moravec算子)


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

算法原理如下:

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

大致就是下面這個樣子:

公式:

這里k是窗口的半徑。

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

公式:

 

3.設定一個閾值,將大於該閾值初次候選特征值的選為二次候選特征值。

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

原圖:

處理后:

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,[]);

算法整個過程還是很簡單的,練習一下,順便祭下這個特征值開山算法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM