%读取图片,转化为pgm格式
im1=imread('003.png');
im2=imread('004.png');
im1=rgb2gray(im1);
im2=rgb2gray(im2);
imwrite(im1,'003.pgm','pgm');
imwrite(im2,'004.pgm','pgm');
im1=im2double(im1);
im2=im2double(im2);
%寻找对应特征点
%该函数来自下载的sift找特征的.m文件,返回的match1是图片1的特征在图片2匹配到的特征的位置,没有匹配到的为0。
[num,loc1,loc2,match1]=match('003.pgm','004.pgm');
%pair是两图中一对对匹配的点的坐标合集
pair=zeros(size(match1,2),4);
k=1;
for i=1:size(match1,2)
if match1(1,i)~=0
pair(k,1)=loc1(i,1);
pair(k,2)=loc1(i,2);
pair(k,3)=loc2(match1(i),1);
pair(k,4)=loc2(match1(i),2);
k=k+1;
end
end
%拼接
%计算图二相对于图一总的偏移量
count=1;
de_y=0;
de_x=0;
for i=1:size(pair,1)
if pair(count,1)~=0
de_y=pair(i,3)-pair(i,1)+de_y;
de_x=pair(i,4)-pair(i,2)+de_x;
count=count+1;
end
end
de_y=ceil(de_y/(count-1));
de_x=ceil(de_x/(count+1));
%建立拼接平面
last=zeros(size(im1,1)*3,size(im1,2)*3);
%把第二张图放在中间
for i=1:size(im1,1)
for j=1:size(im1,2)
last(i+size(im1,1),j+size(im1,2))=im2(i,j);
end
end
%把第一张图拼到第二张图上
for i=1:size(im1,1)
for j=1:size(im1,2)
last(i+size(im1,1)+de_y,j+size(im1,2)+de_x)=im1(i,j);
end
end
figure,imshow(last);