关于图像拼接的简单实现

最近跟在老师后面做一个项目,老师叫我先自己实现关于图像拼接部分,上网搜了很多资料,总算有一点收获,自己也写了一些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');

    


最终实验结果:


效果还不怎么好,所以我最近还在尝试对其中一张图片进行放射变换,然后再将其与另一张图片进行拼接。

若有不足的地方,诚切希望得到您的建议和指点,谢谢~




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值