图像拼接(不投影到柱面)(渐入渐出融合) matlab程序

本文详细介绍了一种图像拼接流程,包括图像配准、变换矩阵计算及图像融合方法,并对比了不同融合技术的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,先拍摄一组图片,比如两幅图:A、B

      我直接用网上的两幅图:


2,分别投影到柱面坐标系

    就用自己写的柱面投影程序 matlab里 结果:


3,开始配准第一步:SIFT得到匹配对(直接用OpenCV里自带的)

有两三对误匹配对,后来调整阈值得到没有误匹配对的结果。

4,配准第二步:根据匹配对得到图片A、B的变换矩阵H (将上一步的结果保存给matlab然后自己计算变换矩阵H)

     图太大了       匹配对坐标输出来给两个txt文件  然后matlab读 计算H变换矩阵

     上一次我是用前五个匹配对来计算变换矩阵H 这样误差会很大  所以不能只用五个点  要用尽量多的正确匹配对的坐标计算 这样误差就很小  计算出来的H=[1,0,-255;0,1,4;0,0,1];

5,图像配准第五步:以一幅图为参考图,另一幅图为目标图,对目标图进行H矩阵变换,完成配准

A=imread('F:\fisheye\srcpin1.jpg');
[H,W,k]=size(A);
%先计算目标图的大小
Y=2*W-255+1;
C=zeros(H,Y);
for i=1:H
    for j=1:W
        C(i,j,1)=A(i,j,1);
        C(i,j,2)=A(i,j,2);
        C(i,j,3)=A(i,j,3);
        y=W+j-255;
        x=i+4;
        if(x>H||x<1||y>Y||y<1)
            continue;
        end
        C(x,y,1)=B(i,j,1);
        C(x,y,2)=B(i,j,2);
        C(x,y,3)=B(i,j,3);
    end
end
C=uint8(C);

结果:


这个比我前一篇没有弄懂H矩阵的作用和投影到柱面之前硬拼的结果好多了   看这幅图 就知道原来H矩阵这么重要  这还只是进行H矩阵变换的结果  还没有进行图像融合  下一步就是进行图像融合消除拼接缝 让过渡得更自然 

突然想试下不拿投影到柱面后的图   直接拿原图 进行H矩阵变换  结果:


这么一对比 怎么感觉投影到柱面根本没有必要了啊  这样子的比投影到柱面的效果还好多了   虽然同样的是都还有拼接缝隙

      不过我只是知道了H矩阵的重要  还不知道投影到柱面的重要哪怕据说它是统一坐标系 可是比如 一幅图A第一个点(1,1)投影到柱面后坐标变为(1,21)  我把第一幅图A全部投影完 然后我对第二幅图B投影的时候第一个点它还是(1,1)啊 那投影到柱面 那还是变成(1,21)啊 两幅图一样大小  那它们投影出来一样的坐标啊 那怎么表示统一到坐标系的  

6,图像融合消除拼接缝隙(也在matlab上做)

用的渐入渐出融合即:距离权重融合

[H,Y,k]=size(C);
ay=W+1-255;
cy=W;
if ay<cy
    min=ay;
    max=cy;
else
    min=cy;
    max=ay;
end
n=max-min;
for i=1:H
    for j=min:max
        d=i/n;
        x=i-4;
        y=j+255-W;
        if(x<1||x>H||y<1||y>W)
            continue;
        end
        C(i,j,1)=d*A(i,j,1)+(1-d)*B(x,y,1);
        C(i,j,2)=d*A(i,j,2)+(1-d)*B(x,y,2);
        C(i,j,3)=d*A(i,j,3)+(1-d)*B(x,y,3);
    end
end

结果:


这个。。。。。不对!!!这个曝光,,,一点也没有让缝隙消失的作用 反而更不好  应该是哪里搞错了。

然后我又用了《图像拼接技术的研究、实现与应用》里的 非线性加权融合 结果:

%接下来进行图像融合 融合其实是指重叠区域部分 让它过渡自然而已
[H,Y,k]=size(C);
ay=W+1-255;
cy=W;
if ay<cy
    min=ay;
    max=cy;
else
    min=cy;
    max=ay;
end
n=max-min;
M1=0;
n1=0;
%第一幅图在重叠部分的亮度均值
for i=1:H
    for j=min:max
        M1=M1+0.59*A(i,j,1)+0.11*A(i,j,2)+0.3*A(i,j,3); 
        n1=n1+1;
    end
end
M1mean=M1/n1;
M2=0;
n2=0;
for i=1:H
    for j=1:n
        M2=M2+0.59*B(i,j,1)+0.11*B(i,j,2)+0.3*B(i,j,3); 
        n2=n2+1;
    end
end
M2mean=M2/n2;
M=(M1mean+M2mean)/2;
D=C;
for i=1:H
    for j=min:max
        sita1=(j-min)*pi/n;
        sita2=(max-j)*pi/n;
        d1=(1+sin(sita1-pi/2))/2;
        d2=(1+sin(sita2-pi/2))/2;
        A(i,j,1)=A(i,j,1)+d1*(M-M1mean);
        A(i,j,2)=A(i,j,2)+d1*(M-M1mean);
        A(i,j,3)=A(i,j,3)+d1*(M-M1mean);
        x=i-4;
        y=j+255-W;
        if(x<1||x>H||y<1||y>W)
            continue;
        end
        B(x,y,1)=B(x,y,1)+d2*(M-M2mean);
        B(x,y,2)=B(x,y,2)+d2*(M-M2mean);
        B(x,y,3)=B(x,y,3)+d2*(M-M2mean);
        D(i,j,1)=d1*A(i,j,1)+d2*B(x,y,1);
        D(i,j,2)=d1*A(i,j,2)+d2*B(x,y,2);
        D(i,j,3)=d1*A(i,j,3)+d2*B(x,y,3);
    end
end

结果:

虽然看得出来好像是亮度有变换 重叠区域那里   但怎么感觉还没有没融合之前的那张好  处理后怎么这么畸形

刚刚检查了下 ,渐入渐出融合法,重新写了下:

[H,Y,k]=size(C);
ay=W+1-255;
cy=W;
if ay<cy
    min=ay;
    max=cy;
else
    min=cy;
    max=ay;
end
n=max-min;
for i=1:H
    for j=min:max
        d=1-(j-min)/n;
        x=i-4;
        y=j+255-W;
        if(x<1||x>H||y<1||y>W)
            continue;
        end
        C(i,j,1)=d*A(i,j,1)+(1-d)*B(x,y,1);
        C(i,j,2)=d*A(i,j,2)+(1-d)*B(x,y,2);
        C(i,j,3)=d*A(i,j,3)+(1-d)*B(x,y,3);
    end
end

结果:

好像几乎看不出来缝隙在哪里了  除了去看右上方平移往下多出来的一点黑色背景  我找不到缝隙在哪里了  这是不是才是正确的渐入渐出的效果   和下面这幅没经过融合之前的图片比较下:

这幅还是看得出来缝隙的    上一幅几乎看不到缝隙  我不算近视眼  所以应该渐入渐出融合法(基于距离的融合法)编正确了。  至于后面那篇论文里的非线性加权融合法 我再检查看看。

为了验证我和那个大叔的想法谁是对的 我现在拿鱼眼图片 先校正 校正后我没有进行柱面投影 (跟上一个一样因为柱面投影后效果反而不好  所以我就不柱面投影)然后进行SIFT得到匹配对  然后计算H矩阵 得到H=[1,0,-118;0,1,3;0,0,1]; 然后对一幅图进行H矩阵变换,结果:

可以看到经过H矩阵变换后还是有明显缝隙的   然后进行渐入渐出融合:结果:

效果还可以   但还是要改进

可以和原图比较下:



总结下:SIFT部分是用OPENCV自带的函数运行的,后面的全在MATLAB上运行。

            其实关键还是特征点检测匹配部分,这部分如果得到的结果不正确,那么H矩阵计算出来就有很大误差,不能直接使用,还要自己调整下,所以这部分至关重要,所以 我想 这也就是为什么有那么多人仍然在致力于改进各种特征点检测、匹配算法 如:SIFT、SURF、Harris等

           然后融合算法也很重要:用来减小曝光差异、用来擦除拼接缝隙,所以也有很多人致力于改进融合算法。


后续:现在才能编一种渐入渐出融合,下次看论文看到好的融合算法再来写!还会试下投影到柱面进行拼接融合的效果!

在写渐入渐出融合的时候,顺便想了一个改进,因为我每周有一个高中数学的家教,正好在教那个孩子三角函数,于是我把三角函数用到了渐入渐出融合之中,结果融合出来是这样,可以和渐入渐出融合的结果对比下,细心会发现拼接痕迹没那么明显了,通过计算对融合效果评价的指标 信息熵 PSNR以及MSE 发现 的确是改进了效果  只是肉眼看不出太太明显的区别  但是在渐入渐出上改进的 所以它们都存在重影和鬼影的问题   这个就要用到最佳缝合线融合了  据说可以消除重影鬼影  下次试下:


刚刚看到《全景图像拼接关键技术研究》里有个 对比度调制融合算法,感觉有问题,第三步 它说利用提取到的A图的归一化的对比度对B进行调制,也就是对应像素相乘,这得到的就是初步的融合图像后续只需要把它重新量化到[0,255]就好了,可是这样相乘的结果还是一幅图的大小啊,而两幅图像融合后图片肯定至少列增加了啊 还用原来的大小,这个怎么想还是觉得有问题,还是编了下:

function I=duibifusion(A,B)
%《全景图像拼接关键技术研究》对比度调制法图像融合 错的???
%适合灰度图
A=rgb2gray(A);
g=lowpassfilter(A);
[m,n]=size(A);
for i=1:m
    for j=1:n
        CL(i,j)=(A(i,j)-g(i,j))/g(i,j);
    end
end
minshu=min(min(CL));
maxshu=max(max(CL));
for i=1:m
    for j=1:n
        CLN(i,j)=(CL(i,j)-minshu)/(maxshu-minshu);
    end
end
B=rgb2gray(B);
for i=1:m
    for j=1:n
        I(i,j)=CLN(i,j)*B(i,j);
    end
end
minshu2=min(min(I));
maxshu2=max(max(I));
for i=1:m
    for j=1:n
        I(i,j)=255*I(i,j)/(maxshu2-minshu2);
    end
end

结果出来是个黑屏 是我写错了 还是这篇论文这个算法有问题 或者没讲清楚??

评论 51
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

元气少女缘结神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值