我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MATLAB全景图切割及盒图显示怎么实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MATLAB全景图切割及盒图显示怎么实现

小编给大家分享一下MATLAB全景图切割及盒图显示怎么实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

part1 全景图切割

原图:

MATLAB全景图切割及盒图显示怎么实现

切割效果:

MATLAB全景图切割及盒图显示怎么实现
MATLAB全景图切割及盒图显示怎么实现

以下是切割部分步骤:
举这张图为例,图片格式hdr,jpg啥的都行:

MATLAB全景图切割及盒图显示怎么实现

1.1 边缘剔除

有些全景图会自带白灰色边缘,若是直接进行切割便会出现如下效果:

MATLAB全景图切割及盒图显示怎么实现

这时候我们首先要对原图进行白边剔除,代码如下:

oriPic=imread('test.hdr');[rows,cols,~]=size(oriPic);for i=cols:-1:1    tempListR=oriPic(floor(rows/4):ceil(3*rows/4),i,1);    tempListG=oriPic(floor(rows/4):ceil(3*rows/4),i,1);    tempListB=oriPic(floor(rows/4):ceil(3*rows/4),i,1);    if all(round(tempListR-mean(tempListR))==0)&&all(tempListR==tempListG)&&all(tempListR==tempListB)        oriPic(:,i,:)=[];    else        break;    endendoriPic=oriPic(:,end:-1:1,:);for i=size(oriPic,2):-1:1    tempListR=oriPic(floor(rows/4):ceil(3*rows/4),i,1);    tempListG=oriPic(floor(rows/4):ceil(3*rows/4),i,1);    tempListB=oriPic(floor(rows/4):ceil(3*rows/4),i,1);    if all(round(tempListR-mean(tempListR))==0)&&all(tempListR==tempListG)&&all(tempListR==tempListB)        oriPic(:,i,:)=[];    else        break;    endendoriPic=oriPic(:,end:-1:1,:);for i=rows:-1:1    tempListR=oriPic(i,floor(cols/4):ceil(3*cols/4),1);    tempListG=oriPic(i,floor(cols/4):ceil(3*cols/4),1);    tempListB=oriPic(i,floor(cols/4):ceil(3*cols/4),1);    if all(round(tempListR-mean(tempListR))==0)&&all(tempListR==tempListG)&&all(tempListR==tempListB)        oriPic(i,:,:)=[];    else        break;    endendoriPic=oriPic(end:-1:1,:,:);for i=size(oriPic,1):-1:1    tempListR=oriPic(i,floor(cols/4):ceil(3*cols/4),1);    tempListG=oriPic(i,floor(cols/4):ceil(3*cols/4),1);    tempListB=oriPic(i,floor(cols/4):ceil(3*cols/4),1);    if all(round(tempListR-mean(tempListR))==0)&&all(tempListR==tempListG)&&all(tempListR==tempListB)        oriPic(i,:,:)=[];    else        break;    endendoriPic=oriPic(end:-1:1,:,:);

1.2 图像裁剪

我们要让完成的就是如下的变换和裁剪:

MATLAB全景图切割及盒图显示怎么实现
MATLAB全景图切割及盒图显示怎么实现

这部分其实已经有较为成熟的原理和代码:
代码参考:https://stackoverflow.com/questions/29678510/convert-21-equirectangular-panorama-to-cube-map

原理参考:
http://paulbourke.net/panorama/cubemaps/#1

http://paulbourke.net/panorama/cubemaps/

原理参考文章中更加清晰的变化图:

MATLAB全景图切割及盒图显示怎么实现

另:
在参考代码的基础上,对映射像素进行了插值处理,可以使图像更加平滑,原理如下:

MATLAB全景图切割及盒图显示怎么实现
MATLAB全景图切割及盒图显示怎么实现

主要函数代码:

function resultPic=createCubeMapFace(oriPic,id,height,width)    [M,N,~]=size(oriPic);    resultPic=zeros([height,width,3]);    an=sin(pi/4);    ak=cos(pi/4);        faceTransform=[0,0;               pi/2,0;               pi,0;               -pi/2,0;               0,-pi/2;               0,pi];    ftu=faceTransform(id,1);    ftv=faceTransform(id,2);    for y=0:height-1        for x=0:width-1            nx=y/height-0.5;            ny=x/width-0.5;            nx=nx*2*an;            ny=ny*2*an;            if (ftv == 0)                u=atan2(nx, ak);                v=atan2(ny*cos(u),ak);                u=u+ftu;            elseif(ftv>0)                d=sqrt(nx*nx+ny*ny);                v=pi/2-atan2(d,ak);                u=atan2(ny,nx);            else                d=sqrt(nx*nx+ny*ny);                v=-pi/2+atan2(d,ak);                u=atan2(-ny,nx);            end            u=u/(pi);            v=v/(pi/2);            while(v<-1)                v=v+2;                u=u+1;            end            while(v>1)                v=v-2;                u=u+1;            end            while(u<-1)                u=u+2;            end            while(u>1)                u=u-2;            end            u=u/2+0.5;            v=v/2+0.5;            u=u*(N-1)+1;            v=v*(M-1)+1;                        fv=floor(v);fv1=floor(v)+1;pv=v-fv;fv1(fv1>M)=M;            fu=floor(u);fu1=floor(u)+1;pu=u-fu;fu1(fu1>N)=N;            resultPic(x+1,y+1,:)=double(oriPic(fv,fu,:)).*(1-pv).*(1-pu)+...                                 double(oriPic(fv1,fu,:)).*(pv).*(1-pu)+...                                 double(oriPic(fv,fu1,:)).*(1-pv).*(pu)+...                                 double(oriPic(fv1,fu1,:)).*(pv).*(pu);        end    end    resultPic=uint8(resultPic);end

函数调用及图像存储:
这里后面长宽数值可以任意设定,但是要求长宽数值一致,如果按照当前写法,结果被存储至result文件夹:

if ~exist('result','dir')   mkdir('result');endfor i=1:6    resultPic=createCubeMapFace(oriPic,i,500,500);    figure(i)    imshow(resultPic)    imwrite(resultPic,['result\',num2str(i),'.jpg'])end

另: 如图所示
图片序号[1,2,3,4,5,6]分别对应图片[右,后,左,前,上,下]

MATLAB全景图切割及盒图显示怎么实现

1.3 完整代码

function panoramic2boxoriPic=imread('889027-884424860.jpg');[rows,cols,~]=size(oriPic);for i=cols:-1:1    tempListR=oriPic(floor(rows/4):ceil(3*rows/4),i,1);    tempListG=oriPic(floor(rows/4):ceil(3*rows/4),i,1);    tempListB=oriPic(floor(rows/4):ceil(3*rows/4),i,1);    if all(round(tempListR-mean(tempListR))==0)&&all(tempListR==tempListG)&&all(tempListR==tempListB)        oriPic(:,i,:)=[];    else        break;    endendoriPic=oriPic(:,end:-1:1,:);for i=size(oriPic,2):-1:1    tempListR=oriPic(floor(rows/4):ceil(3*rows/4),i,1);    tempListG=oriPic(floor(rows/4):ceil(3*rows/4),i,1);    tempListB=oriPic(floor(rows/4):ceil(3*rows/4),i,1);    if all(round(tempListR-mean(tempListR))==0)&&all(tempListR==tempListG)&&all(tempListR==tempListB)        oriPic(:,i,:)=[];    else        break;    endendoriPic=oriPic(:,end:-1:1,:);for i=rows:-1:1    tempListR=oriPic(i,floor(cols/4):ceil(3*cols/4),1);    tempListG=oriPic(i,floor(cols/4):ceil(3*cols/4),1);    tempListB=oriPic(i,floor(cols/4):ceil(3*cols/4),1);    if all(round(tempListR-mean(tempListR))==0)&&all(tempListR==tempListG)&&all(tempListR==tempListB)        oriPic(i,:,:)=[];    else        break;    endendoriPic=oriPic(end:-1:1,:,:);for i=size(oriPic,1):-1:1    tempListR=oriPic(i,floor(cols/4):ceil(3*cols/4),1);    tempListG=oriPic(i,floor(cols/4):ceil(3*cols/4),1);    tempListB=oriPic(i,floor(cols/4):ceil(3*cols/4),1);    if all(round(tempListR-mean(tempListR))==0)&&all(tempListR==tempListG)&&all(tempListR==tempListB)        oriPic(i,:,:)=[];    else        break;    endendoriPic=oriPic(end:-1:1,:,:);% =========================================================================if ~exist('result','dir')   mkdir('result');endfor i=1:6    resultPic=createCubeMapFace(oriPic,i,500,500);    figure(i)    imshow(resultPic)    imwrite(resultPic,['result\',num2str(i),'.jpg'])end% =========================================================================function resultPic=createCubeMapFace(oriPic,id,height,width)    [M,N,~]=size(oriPic);    resultPic=zeros([height,width,3]);    an=sin(pi/4);    ak=cos(pi/4);        faceTransform=[0,0;               pi/2,0;               pi,0;               -pi/2,0;               0,-pi/2;               0,pi];    ftu=faceTransform(id,1);    ftv=faceTransform(id,2);    for y=0:height-1        for x=0:width-1            nx=y/height-0.5;            ny=x/width-0.5;            nx=nx*2*an;            ny=ny*2*an;            if (ftv == 0)                u=atan2(nx, ak);                v=atan2(ny*cos(u),ak);                u=u+ftu;            elseif(ftv>0)                d=sqrt(nx*nx+ny*ny);                v=pi/2-atan2(d,ak);                u=atan2(ny,nx);            else                d=sqrt(nx*nx+ny*ny);                v=-pi/2+atan2(d,ak);                u=atan2(-ny,nx);            end            u=u/(pi);            v=v/(pi/2);            while(v<-1)                v=v+2;                u=u+1;            end            while(v>1)                v=v-2;                u=u+1;            end            while(u<-1)                u=u+2;            end            while(u>1)                u=u-2;            end            u=u/2+0.5;            v=v/2+0.5;            u=u*(N-1)+1;            v=v*(M-1)+1;                        fv=floor(v);fv1=floor(v)+1;pv=v-fv;fv1(fv1>M)=M;            fu=floor(u);fu1=floor(u)+1;pu=u-fu;fu1(fu1>N)=N;            resultPic(x+1,y+1,:)=double(oriPic(fv,fu,:)).*(1-pv).*(1-pu)+...                                 double(oriPic(fv1,fu,:)).*(pv).*(1-pu)+...                                 double(oriPic(fv,fu1,:)).*(1-pv).*(pu)+...                                 double(oriPic(fv1,fu1,:)).*(pv).*(pu);        end    end    resultPic=uint8(resultPic);endend

1.4 其他几组切割结果

图片源自:https://www.cgmodel.com/article/9004.html

MATLAB全景图切割及盒图显示怎么实现
MATLAB全景图切割及盒图显示怎么实现
MATLAB全景图切割及盒图显示怎么实现
MATLAB全景图切割及盒图显示怎么实现
MATLAB全景图切割及盒图显示怎么实现
MATLAB全景图切割及盒图显示怎么实现

part2 盒图展示

2.1 曲面绘制

使用surf绘制各个曲面后,并为各个曲面贴图:

for i=1:6    oriPic.(['p',num2str(i)])=imread(['result\',num2str(i),'.jpg']);   end[rows,cols,~]=size(oriPic.p1);[baseXY,baseZ]=meshgrid(1:cols,rows:-1:1);ax=gca;hold(ax,'on')surf(baseXY(:,end:-1:1)-(1+rows)/2,-(rows-1)./2.*ones(size(baseXY)),baseZ,'CData',oriPic.p1,'EdgeColor','none','FaceColor','interp')surf(-(rows-1)./2.*ones(size(baseXY)),baseXY-(1+rows)/2,baseZ,'CData',oriPic.p2,'EdgeColor','none','FaceColor','interp')surf(baseXY-(1+rows)/2,(rows-1)./2.*ones(size(baseXY)),baseZ,'CData',oriPic.p3,'EdgeColor','none','FaceColor','interp')surf((rows-1)./2.*ones(size(baseXY)),baseXY(:,end:-1:1)-(1+rows)/2,baseZ,'CData',oriPic.p4,'EdgeColor','none','FaceColor','interp')surf(baseXY'-(1+rows)/2,baseXY-(1+rows)/2,ones(size(baseXY)),'CData',oriPic.p6(end:-1:1,end:-1:1,:),'EdgeColor','none','FaceColor','interp')surf(baseXY'-(1+rows)/2,baseXY-(1+rows)/2,rows-1+ones(size(baseXY)),'CData',oriPic.p5(:,end:-1:1,:),'EdgeColor','none','FaceColor','interp')

MATLAB全景图切割及盒图显示怎么实现
MATLAB全景图切割及盒图显示怎么实现

2.2 视角调整

通过设置axes属性将视角调整至盒子里面

ax=axes('parent',fig,'position',[-0.45 -0.45 1.9 1.9]);hold(ax,'on')ax.ZLim=[0,rows+1];ax.XLim=[0-(1+rows)/2,rows+1-(1+rows)/2];ax.YLim=[0-(1+rows)/2,rows+1-(1+rows)/2];ax.Color=[0 0 0];ax.CameraPosition=[0,0,rows/2];ax.CameraPositionMode='manual';ax.DataAspectRatio=[1,1,1];ax.DataAspectRatioMode='manual';ax.Projection='perspective';ax.CameraTargetMode='manual';ax.CameraViewAngle = 7;ax.View=[-2.7391 90.0000];ax.CameraTarget=[0 0 (rows-1)/2];ax.Toolbar.Visible='on';

运行后点击那个三位旋转按钮即可开始漫游

MATLAB全景图切割及盒图显示怎么实现

此时的盒图是无缝隙版本,有缝隙版放在后面

MATLAB全景图切割及盒图显示怎么实现

2.3 完整代码

无缝隙版:

function showBoxfor i=1:6    oriPic.(['p',num2str(i)])=imread(['result\',num2str(i),'.jpg']);   end[rows,cols,~]=size(oriPic.p1);[baseXY,baseZ]=meshgrid(1:cols,rows:-1:1);fig=figure('units','pixels','position',[300 80 500 500],...                       'Numbertitle','off','menubar','none','resize','off',...                       'name','box');                   ax=axes('parent',fig,'position',[-0.45 -0.45 1.9 1.9]);hold(ax,'on')ax.ZLim=[0,rows+1];ax.XLim=[0-(1+rows)/2,rows+1-(1+rows)/2];ax.YLim=[0-(1+rows)/2,rows+1-(1+rows)/2];ax.Color=[0 0 0];ax.CameraPosition=[0,0,rows/2];ax.CameraPositionMode='manual';ax.DataAspectRatio=[1,1,1];ax.DataAspectRatioMode='manual';ax.Projection='perspective';ax.CameraTargetMode='manual';ax.CameraViewAngle = 7;ax.View=[-2.7391 90.0000];ax.CameraTarget=[0 0 (rows-1)/2];ax.Toolbar.Visible='on';surf(baseXY(:,end:-1:1)-(1+rows)/2,-(rows-1)./2.*ones(size(baseXY)),baseZ,'CData',oriPic.p1,'EdgeColor','none','FaceColor','interp')surf(-(rows-1)./2.*ones(size(baseXY)),baseXY-(1+rows)/2,baseZ,'CData',oriPic.p2,'EdgeColor','none','FaceColor','interp')surf(baseXY-(1+rows)/2,(rows-1)./2.*ones(size(baseXY)),baseZ,'CData',oriPic.p3,'EdgeColor','none','FaceColor','interp')surf((rows-1)./2.*ones(size(baseXY)),baseXY(:,end:-1:1)-(1+rows)/2,baseZ,'CData',oriPic.p4,'EdgeColor','none','FaceColor','interp')surf(baseXY'-(1+rows)/2,baseXY-(1+rows)/2,ones(size(baseXY)),'CData',oriPic.p6(end:-1:1,end:-1:1,:),'EdgeColor','none','FaceColor','interp')surf(baseXY'-(1+rows)/2,baseXY-(1+rows)/2,rows-1+ones(size(baseXY)),'CData',oriPic.p5(:,end:-1:1,:),'EdgeColor','none','FaceColor','interp')end

MATLAB全景图切割及盒图显示怎么实现

有缝隙版:

function showBox2for i=1:6    oriPic.(['p',num2str(i)])=imread(['result\',num2str(i),'.jpg']);   end[rows,cols,~]=size(oriPic.p1);[baseXY,baseZ]=meshgrid(1:cols,rows:-1:1);fig=figure('units','pixels','position',[300 80 500 500],...                       'Numbertitle','off','menubar','none','resize','off',...                       'name','box');                   ax=axes('parent',fig,'position',[-0.45 -0.45 1.9 1.9]);hold(ax,'on')ax.ZLim=[0,rows+1];ax.XLim=[0-(1+rows)/2,rows+1-(1+rows)/2];ax.YLim=[0-(1+rows)/2,rows+1-(1+rows)/2];ax.Color=[0 0 0];ax.CameraPosition=[0,0,rows/2];ax.CameraPositionMode='manual';ax.DataAspectRatio=[1,1,1];ax.DataAspectRatioMode='manual';ax.Projection='perspective';ax.CameraTargetMode='manual';ax.CameraViewAngle = 7;ax.View=[-2.7391 90.0000];ax.CameraTarget=[0 0 (rows+1)/2];ax.Toolbar.Visible='on';surf(baseXY(:,end:-1:1)-rows/2,-rows./2.*ones(size(baseXY)),baseZ,'CData',oriPic.p1,'EdgeColor','none','FaceColor','interp')surf(-rows./2.*ones(size(baseXY)),baseXY-(1+rows)/2,baseZ,'CData',oriPic.p2,'EdgeColor','none','FaceColor','interp')surf(baseXY-(1+rows)/2,rows./2.*ones(size(baseXY)),baseZ,'CData',oriPic.p3,'EdgeColor','none','FaceColor','interp')surf(rows./2.*ones(size(baseXY)),baseXY(:,end:-1:1)-(1+rows)/2,baseZ,'CData',oriPic.p4,'EdgeColor','none','FaceColor','interp')surf(baseXY'-(1+rows)/2,baseXY-(1+rows)/2,zeros(size(baseXY)),'CData',oriPic.p6(end:-1:1,end:-1:1,:),'EdgeColor','none','FaceColor','interp')surf(baseXY'-(1+rows)/2,baseXY-(1+rows)/2,rows+ones(size(baseXY)),'CData',oriPic.p5(:,end:-1:1,:),'EdgeColor','none','FaceColor','interp')end

MATLAB全景图切割及盒图显示怎么实现
MATLAB全景图切割及盒图显示怎么实现

以上是“MATLAB全景图切割及盒图显示怎么实现”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MATLAB全景图切割及盒图显示怎么实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MATLAB全景图切割及盒图显示怎么实现

小编给大家分享一下MATLAB全景图切割及盒图显示怎么实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!part1 全景图切割原图:切割效果:以下是切割部分步骤:
2023-06-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录