基于MATLAB实现二维图像叠加进行三维重建

三维重建主要过程概述

  1. 绘制圆心位置相同,内外半径相同的系列圆 ,图片尺寸为128*128,类似于血管的圆管柱图像;基于MATLAB实现二维图像叠加进行三维重建_第1张图片
  2. 绘制圆心位置不同,内外半径相同的系列圆,图片尺寸为128*128,类似于血管的圆管柱图像;
  3. 绘制圆心位置不同,内外半径不同的系列圆,图片尺寸为128*128,类似于血管的圆管柱图像;
  4. 对图像进行插值处理
  5. 对图像进行滤波平滑处理
  6. 三维显示由系列圆重建的类血管三维图像

实现步骤和相关代码

系列圆的生成

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张需要的目标图像
基于MATLAB实现二维图像叠加进行三维重建_第2张图片

建立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的区别

滤波平滑

由于项目后部分中采用了不同圆心位置和不同半径大小,因此在两张二维图像之间会有较大的差距,也就是图像与图像之间的突变,为了解决这个问题,需要对图像进行滤波拼平滑处理,去除毛刺

左图为平滑处理过的结果,右图为未处理的对比结果
基于MATLAB实现二维图像叠加进行三维重建_第3张图片基于MATLAB实现二维图像叠加进行三维重建_第4张图片

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的结果对比
基于MATLAB实现二维图像叠加进行三维重建_第5张图片基于MATLAB实现二维图像叠加进行三维重建_第6张图片基于MATLAB实现二维图像叠加进行三维重建_第7张图片基于MATLAB实现二维图像叠加进行三维重建_第8张图片

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]的结果对比
基于MATLAB实现二维图像叠加进行三维重建_第9张图片基于MATLAB实现二维图像叠加进行三维重建_第10张图片

添加光线效果

lightangle(45,30);
lighting gouraud
p.AmbientStrength = 0.8;
p1.SpecularColorReflectance = 0;
p1.SpecularExponent = 50;

添加光线效果和未添加光线效果的结果对比图
基于MATLAB实现二维图像叠加进行三维重建_第11张图片基于MATLAB实现二维图像叠加进行三维重建_第12张图片

其他系列圆的结果展示

基于MATLAB实现二维图像叠加进行三维重建_第13张图片基于MATLAB实现二维图像叠加进行三维重建_第14张图片

你可能感兴趣的:(基于MATLAB实现二维图像叠加进行三维重建)