基于MATLAB实现二维图像叠加进行三维重建
三维重建主要过程概述
- 绘制圆心位置相同,内外半径相同的系列圆 ,图片尺寸为128*128,类似于血管的圆管柱图像;
- 绘制圆心位置不同,内外半径相同的系列圆,图片尺寸为128*128,类似于血管的圆管柱图像;
- 绘制圆心位置不同,内外半径不同的系列圆,图片尺寸为128*128,类似于血管的圆管柱图像;
- 对图像进行插值处理
- 对图像进行滤波平滑处理
- 三维显示由系列圆重建的类血管三维图像
实现步骤和相关代码
系列圆的生成
clear all;
close all;
clc;
定义参数,h,w为图像的尺寸大小,这里我们把它设置为128*128,内外半径的取值是10和12。此处使用索引Index,是为了最后一步存储图像的时候使用
h = 128;
w = 128;
r1 = 10;
r2 = 12;
Index = [1:80];
nFrames = 80
for i=1:80
I = zeros(h, w);
[x, y] = meshgrid(1:w, 1:h);
a = ceil(w/2);
b = ceil(h/2);
I( r1^2 <=((x-a).^2 +(y-b).^2)) = 1;
I(((x-a).^2 +(y-b).^2) <= r1^2 ) = 0.5;
I(((x-a).^2 +(y-b).^2)>= r2^2 ) = 0;
imwrite(I[‘C:\Users\Administrator\Desktop\t’,num2str(Index(i)),’.png’]);
end
改变圆心的位置只需要改变a,b的大小即可实现。改变半径的大小可以改变r1和r2的值
b = ceil(h/2)+ 0.00001* i * i * i;
b = ceil(h/2)+ 5 * sin(pi * i /60);
在循环中加入
r1 = r1+0.01;
r2 = r2+0.01;
通过以上代码即可生成80张需要的目标图像
建立model读取数据
Box.x = 1;
Box.y = 1;
Box.w = 128;
Box.h = 128;
nFrames = 80;
Image = zeros(Box.h,Box.w,nFrames);
Index = [1:80];
for i=1:nFrames
filename = [‘C:\Users\Administrator\Desktop\t’,num2str(Index(i)),’.png’];
im = imread(filename);
Image(:,:,i) = squeeze((im(Box.y:Box.y+Box.h-1,Box.x:Box.x+Box.w-1)));
end
图像插值
插值主要是为了在数据不足的情况下,丰富图像数量,但在本项目中,由于生成和使用的图像均为80帧,因此暂时没有必要
[x,y,z] = size(Image);
[hx,hy,hz] = meshgrid(1:y, 1:x, 1:z);
hr = interp3(Image, hx, hy, hz, ‘cubic’);
此处采用的是cubic插值,可使用spline,linear,nearest等。另外此处应注意插值hx,hy,hz和x,y,z的区别
滤波平滑
由于项目后部分中采用了不同圆心位置和不同半径大小,因此在两张二维图像之间会有较大的差距,也就是图像与图像之间的突变,为了解决这个问题,需要对图像进行滤波拼平滑处理,去除毛刺
左图为平滑处理过的结果,右图为未处理的对比结果
for i=1:y
for j=1:x
z_data = squeeze(hr(i,j,:));
z_data_f = medfilt1(z_data,20);
hr(i,j,:) = z_data_f;
end
end
W = fspecial(‘average’,[10,10]);
for i=1:z
imdata = squeeze(hr(:,:,i));
imdata = imfilter(imdata,W,‘replicate’);
hr(:,:,i) = imfilter(imdata,W,‘replicate’);
end
此外,也可以采用高斯滤波
W = fspecial(‘gaussian’,[10,10],1);
for i=1:z
imdata = squeeze(hr(:,:,i));
imdata = imfilter(imdata,W,‘symmetric’);
hr(:,:,i) = imfilter(imdata,W,‘symmetric’);
end
三维成像
为了得到更好的成像效果,再次进行一次smooth操作
Image = smooth3(hr(:,:,1:1:end));
将等值面设置为20
fw=20;
p=patch(isosurface(Image,fw)
fw为20,60,100,150的结果对比
p是三维图像表面,facecolor用于修改其主体颜色,edgecolor用于修改其边界的颜色,facealpha和edgealpha用于修改其透明度。p1是三维图像的顶部和底部
set(p,‘facecolor’,’[0.75,0.1,0.2]’,‘Edgecolor’,‘none’,‘FaceAlpha’,1,‘EdgeAlpha’,0.5);
isonormals(Image,p);
p1=patch(isocaps(Image, fw));
set(p1, ‘FaceColor’, ‘red’, ‘EdgeColor’, ‘none’,‘FaceAlpha’,0.5,‘EdgeAlpha’,0);
colormap可以选择其他类型标准颜色图,如cool,gray,hot,hsv等,个人认为jet在此处显示最佳。daspect定义三个坐标轴的比例,此处z值为0.5是为了显示一个狭长的效果
colorbar
colormap(‘jet’)
daspect([1,1,0.5])
view(3)
[1,1,0.5]和[1,1,1]的结果对比
添加光线效果
lightangle(45,30);
lighting gouraud
p.AmbientStrength = 0.8;
p1.SpecularColorReflectance = 0;
p1.SpecularExponent = 50;
添加光线效果和未添加光线效果的结果对比图
其他系列圆的结果展示
基于MATLAB实现二维图像叠加进行三维重建相关推荐
- ICLR 2021|基于GAN的二维图像无监督三维形状重建
2D GAN知道3D形状吗?基于GAN的二维图像无监督三维形状重建 论文.代码地址:在公众号「计算机视觉工坊」,后台回复「二维图像GAN」,即可直接下载. 摘要: 自然图像是三维物体在二维图像平面上的 ...
- matlab中的delaunay,基于MATLAB 实现二维delaunay 三角剖分
基于MATLAB 实现二维delaunay 三角剖分 刘锋涛凡友华 (哈尔滨工业大学深圳研究生院深圳518055) [摘要]在已知凸多边形的顶点坐标的前提情况下,利用MATLAB 中的meshgrid ...
- 基于MATLAB的二维与三维插值拟合运算(附完整代码)
· 一. 一维插值 interp1函数在上个博客中(如下链接)已经更新了,此处再补充两个相关例题. 基于MATLAB的数据插值运算:Lagrange与Hermite算法(附完整代码)_唠嗑!的博客-C ...
- 【二维码图像矫正增强】基于MATLAB的二维码图像矫正增强处理仿真
1.软件版本 matlab2013b 2.算法流程概述 通过形态学处理获得二维码部分的图像区域及边界: 采用凸包算法来计算边界上的点集: 然后根据点集来寻找二维码的四个顶点, 然后透视变换矫正,二维码 ...
- 【光学】基于Matlab实现二维光子晶体的能带图和场
1 内容介绍 为了了解电磁波在光子晶体中的传输特性,用MATLAB与时域有限差分法把电磁波在真空与光子晶体中的传播实时可视化,并给出了场的空间静态分布.数值模拟的结果表明,禁带中的波被光子晶体控制,其 ...
- OpenCV图像处理:基于RANSAC的二维图像中直线、圆及椭圆的检测 C++
基于ransac的直线.圆及椭圆检测算法C++代码 LINK: https://github.com/Yiphy/Ransac-2d-Shape-Detection # Ransac-2d-Shape ...
- matlab的二维曲线论文,基于几何画板与MATLAB绘制二维曲线
第 26 卷 第 6 期 牡丹江大学学报 Vol.26 No.6 2017 年 6 月 Journal of Mudanjiang University Jun. 2017 132 文章编号:1008 ...
- 【MATLAB】二维绘图 ( 绘制二维图像 | 设置图像样式 )
文章目录 一.绘制二维图像 1.二维绘图步骤 2.二维绘图步修饰 3.代码示例 二.设置图像参数 1.图像参数 2.代码示例 一.绘制二维图像 1.二维绘图步骤 绘图前需要给定 xxx 轴 , yyy ...
- 二维图像中的Hessian矩阵(及MATLAB代码)
文章目录 一.图像中Hessian矩阵的定义及公式推导 二.MATLAB代码 一.图像中Hessian矩阵的定义及公式推导 对于二维图像 f ( x , y ) f(x,y) f(x,y),在点 x ...
最新文章
- 祝全天下的教师,节日快乐!
- java 链表反转_LeetCode206 实现单链表的反转
- 第二十一章流 14临时文件
- Django 下添加左侧字段显示和搜索
- WPF 创建自定义面板
- 染色(树链剖分 洛谷-P2486)
- 【HDU 1024】【线性DP】Max Sum Plus Plus
- 软件有打印按钮,能够直接打印出来。手机上有三星的共享打印组件。
- html5回到顶部代码,JS返回顶部实例代码
- 音视频即时通讯解决方案
- 威金病毒(viking)症状和治理方法
- oracle excel vba6,如何在WPS个人Excel表格中启用宏功能来使用VBA
- 开源软件的法律风险及防控
- dns服务器配置错误无法修复,电脑DNS错误修复的方法教程
- Eddy‘s picture
- Java系列之:查看jar包中源代码
- 显卡内存和计算机内存,显卡爆显存和满显存有什么区别
- 微信图片翻译技术优化之路
- 【爬虫】Selenium爬取动态网页的base64图片
- 从共享文件夹到本地磁盘
热门文章
- python挂机脚本怎么运行_Python的自动操作(挂机)脚本相关1
- docker制作centos7.9+apache2.4+php7.4镜像
- 做软件,中国人不比别人差 专访微软中国研究院院长:张亚勤 (转)
- 7139 Dragon slayer
- 新建一台虚拟机的完整教程
- metasploit扫描mysql端口_metasploit-端口扫描
- 卸载oracle9i精简版,oracle9i精简版
- 设计linux软件下载,设计制作编辑器-The LayoutEditor For Linux下载20151012 32位/64位版-西西软件下载...
- R语言如何绘制相互作用网络图(27)
- pandas 百分比显示%