最近跟在老师后面做一个项目,老师叫我先自己实现关于图像拼接部分,上网搜了很多资料,总算有一点收获,自己也写了一些matlab代码,希望能和大家分享一下,若有不足的地方,望大神指点~
下面是两张关于北大楼的图片,但都只有北大楼的一部分,我简单的实现了一下对这两张图片的拼接。
北大楼左半部分-->
北大楼右半部分-->
第一步:
基于ASIFT算法,得出两幅图片的特征点,以及两张图片中匹配的特征点对。这里我原来是使用的SIFT算法匹配特征点的,但效果很差,有时两张图片只能找到4对匹配的特征点对,所以最后我还是使用的ASIFT算法进行的特征点匹配。
第二步:
将对应特征点横纵坐标相减,然后求出一个平均差值,我暂时是这么实现的,最近还在写先使用仿射变换将图像变化,然后再将变换后的图像进行拼接。
这部分的代码如下:
str=dataread('matchings.txt',1);
matchNum=str2num(str);
col1=zeros(1,matchNum);
row1=zeros(1,matchNum);
col2=zeros(1,matchNum);
row2=zeros(1,matchNum);
for i=2:matchNum+1
strData=dataread('matchings.txt',i);
s=regexp(strData,' ','split');
col1(i-1)=str2double(s(1));
row1(i-1)=str2double(s(2));
col2(i-1)=str2double(s(3));
row2(i-1)=str2double(s(4));
end
deltaXSum=0;
deltaYSum=0;
for j=1:matchNum
deltaXSum=deltaXSum+col2(j)-col1(j);
deltaYSum=deltaYSum+row2(j)-row1(j);
end
avgDeltaX=(deltaXSum/matchNum);
avgDeltaY=(deltaYSum/matchNum);
avgDeltaX=uint16(-avgDeltaX);
avgDeltaY=uint16(avgDeltaY);
avgDeltaX
avgDeltaY
f=imread('1-2.jpg');
f=rgb2gray(f);
[frow,fcol]=size(f);
% for p1=1:frow
% for q1=1:fcol
% f(p1,q1)=double(f(p1,q1)/255);
% end
% end
%frow
%fcol
g=imread('1-3.jpg');
g=rgb2gray(g);
[grow,gcol]=size(g);
% for p2=1:grow
% for q2=1:gcol
% g(p2,q2)=double(g(p2,q2)/255);
% end
% end
%grow
%gcol
%imshow(f),figure,imshow(g)
%row
%col
f1=imcrop(f,[0 0 avgDeltaX frow]);
f2=imcrop(f,[avgDeltaX 0 fcol-avgDeltaX frow]);
g1=imcrop(g,[0 0 gcol-avgDeltaX grow]);
g2=imcrop(g,[gcol-avgDeltaX 0 avgDeltaX grow]);
%imshow(f1),figure,imshow(f2),figure,imshow(g1),figure,imshow(g2)
row=frow;
if grow>frow
row=grow;
end
Image=zeros(row+avgDeltaY,fcol+gcol-(fcol-avgDeltaX));
Image=uint8(Image);
% for p3=1:(row+avgDeltaY)
% for q3=1:(fcol+gcol-(fcol-avgDeltaX))
% Image(p3,q3)=0.0;
% end
% end
% for i1=1:frow
% for j1=1:(avgDeltaX)
% Image(i1,j1)=f(i1,j1);
% end
% end
% for i2=(frow+1):(grow+avgDeltaY)
% for j2=1:(avgDeltaX)
% Image(i2,j2)=0;
% end
% end
% for i6=1:avgDeltaY
% for j6=(avgDeltaX+1):fcol
% Image(i6,j6)=f(i6,j6);
% end
% end
% for i3=(avgDeltaY+1):frow
% for j3=(avgDeltaX+1):fcol
% Image(i3,j3)=(f(i3,j3)+g(i3-avgDeltaY,j3-avgDeltaX))/2;
% end
% end
% for i4=(frow+1):(row+avgDeltaY)
% for j4=(avgDeltaX+1):fcol
% Image(i4,j4)=g(i4-avgDeltaY,j4-avgDeltaX);
% end
% end
% for i7=1:avgDeltaY
% for j7=(fcol+1):(fcol+avgDeltaX)
% Image(i7,j7)=0;
% end
% end
% for i5=(avgDeltaY+1):(row+avgDeltaY)
% for j5=(fcol+1):(gcol+avgDeltaX)
% Image(i5,j5)=g(i5-avgDeltaY,j5-avgDeltaX);
% end
% end
for i1=1:avgDeltaY
for j1=1:(avgDeltaX)
Image(i1,j1)=0;
end
end
for i2=(avgDeltaY+1):(frow+avgDeltaY)
for j2=1:(avgDeltaX)
Image(i2,j2)=f(i2-avgDeltaY,j2);
end
end
for i6=(frow+avgDeltaY+1):grow
for j6=1:(avgDeltaX)
Image(i6,j6)=0;
end
end
for i3=1:avgDeltaY
for j3=(avgDeltaX+1):fcol
Image(i3,j3)=g(i3,j3-avgDeltaX);
end
end
for i4=(avgDeltaY+1):(frow+avgDeltaY)
for j4=(avgDeltaX+1):fcol
o1=double(double(j4-avgDeltaX)/double(fcol-avgDeltaX));o2=double(double(fcol-j4)/double(fcol-avgDeltaX));
%o1,o2
Image(i4,j4)=f(i4-avgDeltaY,j4)*o1+g(i4,j4-avgDeltaX)*o2;
end
end
for i7=(frow+avgDeltaY+1):(grow)
for j7=(avgDeltaX+1):fcol
Image(i7,j7)=g(i7,j7-avgDeltaX);
end
end
for i5=1:grow
for j5=(fcol+1):(gcol+avgDeltaX)
Image(i5,j5)=g(i5,j5-avgDeltaX);
end
end
figure,imshow(Image),imwrite(Image,'1-5.jpg');
最终实验结果:
效果还不怎么好,所以我最近还在尝试对其中一张图片进行放射变换,然后再将其与另一张图片进行拼接。
若有不足的地方,诚切希望得到您的建议和指点,谢谢~