懷柔網(wǎng)站制作煙臺seo網(wǎng)絡(luò)推廣
- 實驗名稱:基于MATLAB的圖像拼接技術(shù)
- 實驗?zāi)康?#xff1a;利用圖像拼接技術(shù)得到超寬視角的圖像,用來虛擬實際場景。
- 實驗原理:
基于相位相關(guān)的圖像拼接技術(shù)是一種基于頻域的方法,通過求得圖像在頻域上是相位相關(guān)特點來找到特征位置,從而進(jìn)行圖像拼接。其基本原理是基于傅氏功率譜的相關(guān)技術(shù)。該方法僅利用互功率譜中的相位信息進(jìn)行圖像配準(zhǔn),對圖像間的亮度變化不敏感,而且所獲得的相關(guān)峰尖突出,具有一定的魯棒性和較高的配準(zhǔn)精度。
??????基于相位相關(guān)法進(jìn)行圖像拼接的基本原理如下:假設(shè)f(x,y)表示尺寸 ?????為M*N的圖像,該函數(shù)的二維離散傅里葉變換(DFT)為:
b=imread('8.jpg');
figure
imshow(a);
figure
imshow(b);
imwrite(b,'160.jpg');
IMG={a,b}; ???????????????????????????????????????????%將圖片存為元胞結(jié)構(gòu)
num=size(IMG,2); ?????????????????????????????????????%計算圖片個數(shù)
move_ht=0; ??????????????????????????????????????????%累計平移量初值
move_wd=0; ???????????????????
for count=1:num-1
??input1=IMG{count}; ?????????????????????????????????%讀取圖象
??input11=imresize(rgb2gray(input1),[300,200]); ????????????????????????????%將圖象轉(zhuǎn)為灰度圖像
??input2=IMG{count+1};
?input12=imresize(rgb2gray(input2),[300,200]);
?F1=fft2(double(input11)); ?????????????????????????????????????????%二維傅里葉變換
F2=fft2(double(input12));
pdm=exp(1i*(angle(F1)-angle(F2))); ??????????????????????????%求互功率譜
cps=real(ifft2(pdm)); ??????%傅里葉反變換,取沖激函數(shù)的實部
[i1,j1]=find(cps==max(max(cps))); ???%需找峰值點
HtTrans=i1-1; ??????????????????%得到平移量
WdTrans=j1-1;
????????if(i1>size(input2,1)/2)
???????????HtTrans=HtTrans-size(cps,1);
????????end
????????if(j1>size(input2,2)/2)
???????????WdTrans=WdTrans-size(cps,2);
????????end
???move_ht=HtTrans; ??????????%最終平移量
move_wd=WdTrans;
ht=move_ht;wd=move_wd;
move_ht=move_ht+ht; ????????????????????????????????%計算累計平移量
??move_wd=move_wd+wd;
??if count==1 ????????????????????????????????????????%拼接圖像
??coimage=my_move(input11,input12,move_ht,move_wd);
??else
??coimage=my_move(coimage,imput12,move_ht,move_wd);
??end
end
coimage1=coimage(15:size(coimage,1)-12,:); ?????????????????%切割圖像
figure
imshow(uint8(coimage));
toc
time=toc
imwrite(uint8(coimage),'161.jpg');
function coimage=my_move(input1,input2,move_ht,move_wd)
%根據(jù)平移量拼接圖像
total_ht=max(size(input1,1),(abs(move_ht)+size(input2,1)));
total_wd=max(size(input1,2),(abs(move_wd)+size(input2,2)));
combImage=zeros(total_ht,total_wd); ???%按照總大小建立矩陣
regimg1=zeros(total_ht,total_wd); ??????%配準(zhǔn)模板1
regimg2=zeros(total_ht,total_wd); ??????%配準(zhǔn)模板2
%根據(jù)平移量選擇配準(zhǔn)方式即選擇拼接圖像的位置
if((move_ht>=0)&(move_wd>=0))
regimg1(1:size(input1,1),1:size(input1,2))=input1;
regimg2((1+move_ht):(move_ht+size(input2,1)),(1+move_wd):(move_wd+size(input2,2)))=input2;
elseif((move_ht<0)&(move_wd<0))
regimg2(1:size(input2,1),1:size(input2,2))=input2;
regimg1((1+abs(move_ht)):(abs(move_ht)+size(input1,1)),(1+abs(move_wd)):(abs(move_wd)+size(input1,2)))=input1;
elseif((move_ht>=0)&(move_wd<0))
regimg2((move_ht+1):(move_ht+size(input2,1)),1:size(input2,2))=input2;
regimg1(1:size(input1,1),(abs(move_wd)+1):(abs(move_wd)+size(input1,2)))=input1;
elseif((move_ht<0)&(move_wd>=0))
regimg1((abs(move_ht)+1):(abs(move_ht)+size(input1,1)),1:size(input1,2))=input1;
regimg2(1:size(input2,1),(move_wd+1):(move_wd+size(input2,2)))=input2;
end
if sum(sum(regimg1==0))>sum(sum(regimg2==0)) %選擇零點較多的配準(zhǔn)圖像為拼接圖像
plant=regimg1; ?bleed=regimg2;
else
plant=regimg2; ?bleed=regimg1;
end
combImage=plant; ?????%得到拼接圖像
for p=1:total_ht
for q=1:total_wd
if(combImage(p,q)==0)
combImage(p,q)=bleed(p,q); ?%將拼接圖像的零點用另一幅圖覆蓋
end
end
end
%%
function [move_ht,move_wd]=my_trans(input1,input2) ??????????%計算兩幅圖像平移量
F1=fft2(input1); ?????????????????????????????????????????%二維傅里葉變換
F2=fft2(input2);
pdm=exp(1i*(angle(F1)-angle(F2))); ??????????????????????????%求互功率譜
cps=real(ifft2(pdm)); ??????%傅里葉反變換,取沖激函數(shù)的實部
[i1,j1]=find(cps==max(max(cps))); ???%需找峰值點
HtTrans=i1-1; ??????????????????%得到平移量
WdTrans=j1-1;
????????if(i1>size(input2,1)/2)
???????????HtTrans=HtTrans-size(cps,1);
????????end
????????if(j1>size(input2,2)/2)
???????????WdTrans=WdTrans-size(cps,2);
????????end
???move_ht=HtTrans; ??????????%最終平移量
move_wd=WdTrans;
end
五 運行結(jié)果