資源簡(jiǎn)介
自己用Matlab寫(xiě)的Moravec算子實(shí)現(xiàn)程序,代碼解釋的很詳細(xì),給大家參考參考

代碼片段和文件信息
%?計(jì)算四個(gè)方向的灰度值差的平方
%?分別是水平向右、垂直鄉(xiāng)下、左下角、右下角
clear?all;
close?all;
clc;
tic?%開(kāi)始時(shí)鐘測(cè)量運(yùn)算時(shí)間
Original=imread(‘hhhh.jpg‘);
[mnd]=size(Original);
if?d==3
????I=rgb2gray(Original);
elseif?d==1
????I=Orginal;
end
????????
%以window*window為像元對(duì)圖像I進(jìn)行滑移計(jì)算
window=3;
w=floor(window/2);
%得到各中心點(diǎn)的坐標(biāo)值,保證滑移窗口在圖像內(nèi)
%因?yàn)橛凶笙陆且苿?dòng),所以y的坐標(biāo)必須比x大1,即x最小從2開(kāi)始,y最小從3開(kāi)始
x_start=w+1;?
y_start=w+2;?
x_end=m-w-1;?
y_end=n-w-1;?
%角點(diǎn)映射圖(cornerness?map)
cornermap=zeros(mn);
%計(jì)算像素坐標(biāo)四個(gè)方向(右、下、右下、左下)的興趣值
for?x=x_start:x_end
????for?y=y_start:y_end
????????%計(jì)算橫向相鄰像素灰度差的平方和
????????v1=0;v2=0;v3=0;v4=0;
????????for?i=-w:w-1
????????????%計(jì)算橫向向右滑移像素灰度差的平方和
????????????v1=v1+(double(I(xy+i))-double(I(xy+i+1)))^2;???????????
????????????%計(jì)算縱向向下滑移像素灰度差的平方和
????????????v2=v2+(double(I(x+iy))-double(I(x+i+1y)))^2;???????
????????????%計(jì)算向左下角滑移像素灰度差的平方和
????????????v3=v3+(double(I(x+iy-i))-double(I(x+i+1y-i-1)))^2;???????????
????????????%計(jì)算向右下角滑移像素灰度差的平方和
????????????v4=v4+(double(I(x+iy+i))-double(I(x+i+1y+i+1)))^2;
????????end
????????%取v1v2v3v4最小者作為像素(xy)的興趣值
????????%同時(shí)邊緣像素點(diǎn)設(shè)值為0
????????cornermap(xy)=min([v1v2v3v4]);
????end
end
%給定一個(gè)經(jīng)驗(yàn)閾值。閾值的選取應(yīng)以候選點(diǎn)包含所需要的特征點(diǎn),而又不包含過(guò)多的非特征點(diǎn)為原則.
threshold=1000;
cornermap(cornermap
%%?非極大值抑制
%設(shè)置局部極大值遍歷窗口
win_supr=5;
w1=floor(win_supr/2);
%計(jì)算每行列未遍歷的像元個(gè)數(shù)
a=mod(mwin_supr);
b=mod(nwin_supr);
%候選特征點(diǎn)在每個(gè)分割單元中是否最大
x1=[];y1=[];
%分割成多個(gè)局部區(qū)域,對(duì)每個(gè)區(qū)域進(jìn)行極大值獲取
%這里不是判斷每個(gè)遍歷窗口中心是否是極大值,而是將每個(gè)遍歷窗口中最大值點(diǎn)作為特征點(diǎn)輸入
%這樣做的意思也即是默認(rèn)每個(gè)子區(qū)域的極大值必然是特征點(diǎn)
for?i=(w1+1):win_supr:(m-a-w1)?
????for?j=(w1+1):win_supr:(n-b-w1)
????????subcorner=cornermap((i-w1):(i+w1)(j-w1):(j+w1));
????????vMax=max(subcorner(:));
????????[x_y_]=find(subcorner==vMax);%兩個(gè)NaN是不能比較大小的,所以會(huì)跳過(guò)去
????????%計(jì)算特征點(diǎn)在原始圖像中的行列號(hào)
????????x1=[x1;i-w1-1+x_];
????????y1=[y1;j-w1-1+y_];
????end
end
toc;
t=toc;
disp([‘本程序的運(yùn)行時(shí)間為‘num2str(t)‘秒。‘])
%%?輸出圖像
figure(1)
subplot(121);
imshow(Original)
title(‘原圖像‘)
xlabel(‘橫向‘)
ylabel(‘縱向‘)
axis?on
%圖像中顯示特征點(diǎn)
subplot(122);
imshow(Original)
hold?on
plot(y1x1‘R*‘)
axis?on
title(‘圖像中顯示特征點(diǎn)‘)
xlabel(‘圖像的列數(shù)‘)
ylabel(‘圖像的行數(shù)‘)
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件???????8250??2014-07-05?19:41??Matlab實(shí)現(xiàn)Moravec算子\hhhh.jpg
?????文件???????2637??2015-03-20?15:41??Matlab實(shí)現(xiàn)Moravec算子\Moravec.m
?????目錄??????????0??2015-03-20?15:40??Matlab實(shí)現(xiàn)Moravec算子
-----------?---------??----------?-----??----
????????????????10887????????????????????3
- 上一篇:eemd源程序
- 下一篇:SPWM波發(fā)生器 multisim仿真圖
評(píng)論
共有 條評(píng)論