柱面投影matlab程序

article/2025/9/27 4:54:12

拼接之前要进行柱面、立方体面或者球面投影,《全景拼接的关键技术研究》选的是柱面投影,根据其理论有:

%假设相机市场角为45度
%反投影到柱面时左右有缝隙了
A=imread('F:\fisheye\kk.jpg');
[H,W,k]=size(A);
f=W/(2*tan(pi/4/2));    %视场角越小则弯曲越小
C=zeros(H,W);
for i=1:H
    for j=1:W
        yy=f*tan((j-W/2)/f)+W/2;
        xx=(i-H/2)*sqrt((j-W/2)^2+f^2)/f+H/2;
        xx=round(xx);
        yy=round(yy);
        if(xx<1||yy<1||xx>H||yy>W)
            nn=nn+1;
            continue;
        end
        C(i,j,1)=A(xx,yy,1);
        C(i,j,2)=A(xx,yy,2);
        C(i,j,3)=A(xx,yy,3);
    end
end
C=uint8(C);

原图(网上下载的美女图 假设相机视场角是pi/4):


则柱面投影结果图:


如果直接用书上那个公式变换下,即:yy=f*tan((j-f*atan(W/2/f))/f)+W/2; 那么缝隙就移到一边去了,即成了这样:


 所以还是用原来的,然后再计算左右两边的缝隙,并把这个缝隙除掉:

len=round(f*atan(-W/2/f)+W/2);
D=zeros(H-1,W-2*len-1);
for i=1:H
    for j=len+1:W-len
        ii=i;
        jj=j-len;
        D(ii,jj,1)=C(i,j,1);
        D(ii,jj,2)=C(i,j,2);
        D(ii,jj,3)=C(i,j,3);
    end
end
D=uint8(D);

结果:

这样就差不多行了

换张校正后的鱼眼图片试试,我知道之前我用鱼眼校正图进行柱面投影时候为什么出来是个黑屏了 因为我依然用的是鱼眼相机的视场角180度   其实校正后的鱼眼图进行柱面投影时就不能把它当做180了 因为其实它已经是个正常图片了,所以假设它是正常相机的60度左右就行,结果:

但是有个大叔坚持认为校正后的鱼眼图片和普通图片不一样  校正后的鱼眼图片进行拼接之前不用进行柱面投影  而且也不能像我一样把它当成普通图片视场角60度左右!

但我觉得不是他说的这样,等我把普通图片的拼接做完,就来试鱼眼图片拼接,看是我认为的这样还是他认为的那样!








1,SIFT/SURF等进行特征点检测和匹配

      这一步之前编过SIFT 但最后还是有问题  所以还是直接用OpenCV上的特征点检测和匹配程序,然后再把得到的匹配对输出给MATLAB,因为我只要它的结果。

2,计算出变换矩阵H

      这是鱼眼图像拼接正式开始的第一步:就是根据SIFT匹配(或者别的匹配方法)找到的构成匹配对的特征点位置信息计算出两幅或几幅图像之间的变换矩阵,即看待拼接图像之间存在什么关系(平移、旋转、仿射等等),我在MATLAB里做的,理论部分根据论文《鱼眼图像全景拼接系统》,论文里只取4对匹配对就够了,我取了5对。

data1=load('matchdata1.txt');    %这是OpenCV中得到的匹配对中第一幅图的坐标 
data2=load('matchdata2.txt');
[m,n]=size(data1);
A=zeros(10,8);
n=1;
arr=[1,1,2,2,3,3,4,4,5,5];
b=zeros(10,1);
for i=1:10
    nn=n/2;
    nnn=fix(nn);
    nnnn=nn-nnn;
    if(nnnn~=0)
       A(i,1)=data1(arr(i),1);
       A(i,2)=data1(arr(i),2);
       A(i,3)=1;
       A(i,4)=0;
       A(i,5)=0;
       A(i,6)=0;
       A(i,7)=-data1(arr(i),1)*data2(arr(i),1);
       A(i,8)=-data1(arr(i),1)*data2(arr(i),2);
       b(i)=data2(arr(i),1);
    else
        A(i,1)=0;
        A(i,2)=0;
        A(i,3)=0;
        A(i,4)=data1(arr(i),1);
        A(i,5)=data1(arr(i),2);
        A(i,6)=1;
        A(i,7)=-data1(arr(i),1)*data2(arr(i),2);
        A(i,8)=-data1(arr(i),2)*data2(arr(i),2);
        b(i)=data2(arr(i),2);
    end
    n=n+1;
end
H=A\b;

H =


    0.6179
   -0.0088
 -135.7927
   -0.1784
    0.6745
   46.5215
   -0.0011
   -0.0001

3,拼接融合算法

    3.1取平均值法

         论文中这部分写得不清楚,无法用来编程,我再找找有没写得比较清晰的关于线性融合的论文。我找了个论文《全景拼接的关键技术研究》这里面几种拼接融合算法写得            比较清晰,我想都实现出来,这个取平均值法融合是最简单的 ,同时也是效果最不好的,我没用投影到柱面,也没用求得的变换矩阵H,因为我目前没弄懂这两个对后续           拼接融合的具体意义,等我弄清楚了再编它们再用,这个取平均值法融合 我是直接用SIFT匹配的结果 直接按照论文中取平均来拼的 可能是位置不太准确吧 重影、拼接线、         错位等问题都存在:

原图:


结果:

       

%《全景拼接的关键技术研究》取平均值融合
%其实最好先判断这两幅是否同样大小,若不,则把这两幅图调成一样大小,这里我懒得调了 它们差不多大小
A=imread('F:\fisheye\mosaic1.jpg');
B=imread('F:\fisheye\mosaic2.jpg');
%先找两幅图的重叠区域
data1=218;    %直接用的OpenCV里SIFT匹配的结果
data2=89;
[m1,n1,k1]=size(A);
[m2,n2,k2]=size(B);
if m1<m2
    M=m2;
    m=m1;
else
    M=m1;
    m=m2;
end
nn1=n1-data1;
if nn1>data2
    n=nn1;
else
    n=data2;
end
z1=zeros(m,n);
z2=z1;
Rect=z1;
for i=1:m
    for j=1:n
      z1(i,j,1)=A(i,data1-1+j,1);
      z1(i,j,2)=A(i,data1-1+j,2);
      z1(i,j,3)=A(i,data1-1+j,3);
      z2(i,j,1)=B(i,j,1);
      z2(i,j,2)=B(i,j,2);
      z2(i,j,3)=B(i,j,3);
      Rect(i,j,1)=(z1(i,j,1)+z2(i,j,1))/2;
      Rect(i,j,2)=(z1(i,j,2)+z2(i,j,2))/2;
      Rect(i,j,3)=(z1(i,j,3)+z2(i,j,3))/2;
    end
end
Rect=uint8(Rect);
N=round(data1+n+n2-data2);
C=zeros(M,N);
for i=1:M
    for j=1:N
        if(j<=data1)
            if(i>m1||j>n1)
                continue;
            end
            C(i,j,1)=A(i,j,1);
            C(i,j,2)=A(i,j,2);
            C(i,j,3)=A(i,j,3);
        elseif(j<=data1+n)
            if(i>m||j-data1>n)
                continue;
            end
            C(i,j,1)=Rect(i,j-data1,1);
            C(i,j,2)=Rect(i,j-data1,2);
            C(i,j,3)=Rect(i,j-data1,3);
        else
            if(i>m||j-data1>n2)
                continue;
            end
            C(i,j,1)=B(i,j-data1,1);
            C(i,j,2)=B(i,j-data1,2);
            C(i,j,3)=B(i,j-data1,3);
        end
    end
end
C=uint8(C);

        3.2 渐入渐出融合

              还是根据这篇论文,渐入渐出融合,依然是直接拼的 没有用投影到同一坐标系 也没用变换矩阵H  因为还是不知道它们的作用啊 好想找到人请教下 没人:

结果:

虽然还是有拼接线 但是重影问题已经好多了 看来还是不能像取平均值法融合一样总是取相同的权值各为1/2  这样重影严重  这个渐入渐出的权值是像论文中写的一样随着位置变化  所以基本消除了重影 但拼接线。。。。


http://chatgpt.dhexx.cn/article/5jARFE0c.shtml

相关文章

柱面投影、拼接视差、球面投影

1. 图像拼接传统做法: 特征点提取:sift、surf、orb等特征点提取; 基于特征点的配准:RANSAC方法剔除匹配点并拟合图像变换矩阵(全局单应性矩阵); 图像融合:先确定缝合线,再利用加权融合、多频带融合的方法融合; 方法:除了按照上文提到的顺序利用opencv进行拼接,还可以…

opencv柱面投影

在做全景拼接的时候&#xff0c;为了保持图片中的空间约束与视觉的一致性&#xff0c;需要进行柱面投影&#xff0c;否则离中心图像距离越远的图像拼接后变形越大。 柱面投影公式为 变换效果如下&#xff1a; int main() {cv::Mat image1 cv::imread("images/1.jpg"…

图片柱面投影简单实现

转自&#xff1a;https://blog.csdn.net/u010551600/article/details/78461142 柱面投影是图片拼接的前期的一部分工作&#xff0c;以下代码只是简单的实现了投影&#xff0c;还可以优化&#xff0c; 柱面半径设置位图片宽度的一半&#xff0c;即 R width/2 代码运算流程是…

柱面投影

做全景拼接时需要将图像统一到一个视角里&#xff0c;常用的柱面投影&#xff0c;其基本原理及公式如下&#xff08;原文&#xff09;。 【Octave】柱面投影简析 我是分割线 在做全景拼接的时候&#xff0c;为了保持图片中的空间约束与视觉的一致性&#xff0c;需要做一定的预…

图像柱面投影

由于图像序列是实体景物在不同坐标系下的二维投影&#xff0c;直接对拍摄图像进行拼接无法满足视觉一致性&#xff0c;所以需要将待拼接的图像分别投影到一个标准的坐标系下&#xff0c;然后再进行图像的拼接。全景图生成系统可以采用圆柱体、立方体和球体等模型来实现。由于柱…

柱面投影介绍与python实现(一)

简介 本文主要介绍柱面投影变换,将这种变换用于图像处理,可以产生图像扭曲的效果,如下图所示,产生了将平面图像投影到了柱面上的视觉效果。博客最后给出了柱面投影的python实现,供读者参考。 数学原理 如下图所示,矩形GHEF为待处理的原图,投影到柱面上之后则变成了…

【Octave】柱面投影简析

我是分割线 在做全景拼接的时候&#xff0c;为了保持图片中的空间约束与视觉的一致性&#xff0c;需要做一定的预处理&#xff0c;可以是球面投影&#xff0c;柱面投影等。 如果仅仅是做水平方向的拼接&#xff0c;则做柱状投影就好了 一. 原理 把平面图像投影到圆柱的曲面上。…

拖库 洗库 撞库

间接转载地址: http://blog.csdn.net/daliaojie/article/details/42171177 一,背景: 用户数据泄露一直是如今互联网世界的一个焦点,从最近的京东撞库抹黑事件,到之前的CSDN,如家用户数据的泄露,服务商和黑客之间在用户数据这个舞台上一直在进行着旷日持久的攻防战。 对于…

分享一个验证码暴力撞库漏洞的案例

记录一个验证码暴力破解的案例&#xff0c;安全问题不容忽视呀。 某公司接到用户反馈&#xff0c;应用存在安全漏洞&#xff0c;通过技术手段可以在无手机情况下&#xff0c;获取验证码&#xff0c;直接修改密码成功。如果用户密码被他人修改成功&#xff0c;直接涉及到资产损…

深入浅出了解撞库攻击!

1. 撞库的原理和危害 “撞库”&#xff08;Credential Stuffing Attack&#xff09;在网络安全中是一个古老的概念&#xff0c;按中文的字面意思解读&#xff0c;就是“碰撞数据库”的意思。“碰撞”意味着碰运气&#xff0c;即不一定能成功&#xff1b;而“数据库”中往往存储…

使用 Burp Suite 暴力破解密码 撞库攻击 从0到1手摸手教学

说明 一个学习的过程 增加自己网络安全知识 切勿用于违法用途 设置密码尽量使用6位以上并规避简单数字组合、加强对同一ip的频繁访问次数限制、设置人机验证减小撞库攻击的危害 用到的工具&环境 本地环境 kali 2022 Burp Suite FireFox 靶机环境 一台服务器 CentO…

【htpwdScan 是一个HTTP暴力破解、撞库测试工具。】

htpwdScan 1.0 htpwdScan 是一个HTTP暴力破解、撞库测试工具。 安装 要求 python3.6 pip3 install requirements.txt特性 支持常见的认证模式&#xff1a;Basic/Digest/NTLM 等 支持对 GET / POST 参数进行暴力破解&#xff0c;支持使用占位符选定参数或参数的一部分 支持批…

MD5碰撞与撞库和题

MD5 相同的情况叫做“碰撞”&#xff0c;现在网络中已经出现了两个相同的 MD5 可执行文件&#xff0c;所以MD5现在已经被弃用了&#xff0c;发生碰撞的概率是1/&#xff08;2^128&#xff09;。 SHA-1 也会发生碰撞&#xff0c;但是几率比 MD5 小的多。 2004年&#xff0c;我…

拖库 洗库 撞库的概念

一&#xff0c;背景&#xff1a; 用户数据泄露一直是如今互联网世界的一个焦点&#xff0c;从最近的京东撞库抹黑事件&#xff0c;到之前的CSDN&#xff0c;如家用户数据的泄露&#xff0c;服务商和黑客之间在用户数据这个舞台上一直在进行着旷日持久的攻防战。 对于大多数用…

(云安全)拖库-洗库-撞库

一&#xff0c;背景&#xff1a; 用户数据泄露一直是如今互联网世界的一个焦点&#xff0c;从最近的京东撞库抹黑事件&#xff0c;到之前的CSDN&#xff0c;如家用户数据的泄露&#xff0c;服务商和黑客之间在用户数据这个舞台上一直在进行着旷日持久的攻防战。 对于大多数用户…

java解决撞库的问题_Web安全开发之验证码设计不当引发的撞库问题

感谢某电商平台安全工程师feiyu跟我一起讨论这个漏洞的修复。以往在安全测试的过程中后台经常存在验证码不失效果造成的撞库问题&#xff0c;甚至在一些银行或者电商的登录与查存页面同样存在这个问题&#xff0c;一旦造成撞库无论对用户账号的安全性还是网站的负载都是巨大的挑…

什么是撞库攻击,如何预防撞库攻击?

1. 撞库的原理和危害 “撞库”&#xff08;Credential Stuffing Attack&#xff09;在网络安全中是一个古老的概念&#xff0c;按中文的字面意思解读&#xff0c;就是“碰撞数据库”的意思。“碰撞”意味着碰运气&#xff0c;即不一定能成功&#xff1b;而“数据库”中往往存储…

撞库详解

撞库攻击是如今最常见的攻击&#xff0c;给企业带来巨大威胁。撞库带来的威胁往往不是直接的&#xff0c;但是由此造成的信息泄露以及进一步的渗透与攻击会更为严重。Akamai的报告显示&#xff0c;2018年五月到十二月期间&#xff0c;共发生了约280亿次撞库攻击&#xff0c;其中…

mysql暴力撞库与弱密码检测

暴力撞库与弱密码检测 最近在生产数据库上碰到了一个问题&#xff0c;觉得挺有意思&#xff0c;总结出来和大家分享下。 关于暴力撞库和弱密码检测。 相信使用数据库的大家应该都不陌生&#xff0c;暴力撞库&#xff0c;简单通俗的讲通过一堆生成的密码&#xff0c;然后用默认…

倾家荡产、隐私全无?独家揭秘撞库攻击!

1. 撞库的原理和危害 “撞库”&#xff08;Credential Stuffing Attack&#xff09;在网络安全中是一个古老的概念&#xff0c;按中文的字面意思解读&#xff0c;就是“碰撞数据库”的意思。“碰撞”意味着碰运气&#xff0c;即不一定能成功&#xff1b;而“数据库”中往往存储…