[数学建模] 1. 血管的三维重建

数学建模 专栏收录该内容
3 篇文章 1 订阅

暑期学校数学建模培训第一次模拟:2001年国赛试题,血管的三维重建,论文结构比较完整,数据、代码均正确无误。题目较老,数据量就小,主要还是matlab对图像处理需要准备一下。模拟期间也是在CSDN查找了些许资料,现将自己组的论文上传上来为开源社区做微薄贡献。在模型推广上面我组想法很多,但考虑到论文完成时间有限,故写的很简略,感兴趣需要讨论的各路师生、朋友可以下方评论留言,一起讨论进步。


 

附录

程序1:求100张切片最大内切圆圆心坐标、半径matlab程序代码

clc,clear,close all
%% 读取0-99图片,并输出
for ii=0:99
    imageName=strcat(num2str(ii),'.bmp'); % imageName 图片名
    imdata = imread(imageName);     % imdata 灰度图像矩阵
    imblack(:,:,ii+1)=imdata; % imblack 100张图片灰度矩阵以三维数组进行存储
    % imdata= imshow(imageName);   %  打印图片 
end
%% 翻转图片imread值,为下一步骨架提取做准备
for z=1:100
    for a=1:512
        for j=1:512
            imwhite(a,j,z)=1-imblack(a,j,z); % 1-0互换,方便提取骨架
        end
    end
      % imshow(imwhite(:,:,z));     % 显示1-0转换后的图像
      BW0(:,:,z) = edge(imwhite(:,:,z),'sobel');      % 显示图像轮廓
      BW1(:,:,z) = bwmorph(imwhite(:,:,z),'skel',inf);
%BW1 将0-99图像骨架化,存入三维矩阵BW1
      % BW2(:,:,z) = bwmorph(BW1(:,:,z),'spur',inf);      
% BW2 将所得骨架进行消刺处理
      imshow(BW1(:,:,z))        % 输出骨架图像
end
%% 求0-99图片最大内切圆及轴点、半径
Result=zeros(100,4); % Result用于存储每张图片,x、y、z坐标及最大内切圆半径R
for zz=1:100     %遍历每张图片
    [x0,y0,z0]=find(BW0(:,:,zz));     %返回行,列,值(非0元素)
    [a,b,c]=find(BW1(:,:,zz));     %返回行,列,值(非0元素)
    max_coord=length(a);        % 返回骨架中非0元素的 个数
    n=length(x0);       % 返回轮廓中非0元素的 个数
    r1=zeros(max_coord,n);      % 骨架和轮廓非0元素构成 max_coord*n 的0矩阵
    g=zeros(max_coord,2);       % 构造 m*2 的0矩阵
        for i=1:max_coord       % 遍历每一个骨架中非0的元素
            for j=1:n       % 遍历每一个轮廓中的非0元素
                x1=a(i);
                y1=b(i);    
                x2=x0(j);
                y2=y0(j);
                r1(i,j)=sqrt((x1-x2)^2+(y1-y2)^2); % 求骨架点到轮廓点的距离
            end
            [r2,coord]=min(r1(i,:)); % 求一个骨架点到所有轮廓点距离的最小值
            g(i,1)=r2;
            g(i,2)=coord;
        end
        [max_r,max_coord]=max(g(:,1));   
% 求一个骨架点到所有轮廓点的距离的最小值的最大值
        x=a(max_coord)-256;     % 坐标转换
        y=b(max_coord)-256;     % 坐标转换
 
        Result(zz+1,1)=x;       % x坐标存储
        Result(zz+1,2)=y;       % y坐标存储
        Result(zz+1,3)=zz+1;    % z坐标存储
        Result(zz+1,4)=max_r;       % 半径存储
       xlswrite('F:\是AAAA\matlab11\图像处理\附件A题bmp\新建.xlsx',Result);       % 路径请自行添加
end

程序2:中轴线在XOY、YOZ、ZOX平面的投影图matlab程序代码

%% 问题二 源代码(中轴线图像及投影)
% 将中轴线及三个方向上的投影显示在一个图像上
% 程序的预处理
clear %清空变量
clc % 清屏
close  % 关闭窗口
%% 函数的输入
z = 1:1:100;
x = -1.645e-07*z.^5+9.822e-06*z.^4+0.002147*z.^3-0.1358*z.^2+2.19*z-167.5;
y = 5.47e-07*z.^5-0.000142*z.^4+0.01168*z.^3-0.3354*z.^2+4.308*z-10.75;
 
%% 将中轴线及三个方向上的投影在一个图像上显示
subplot(2,2,1)      
plot3(x,y,z)
title('图一:主轴线')
grid on
xlabel('x轴');
ylabel('y轴');
zlabel('z轴');
 
subplot(2,2,2)
plot(z,x)
title('图二:XOZ面投影')
grid on
xlabel('x轴');
ylabel('z轴');
 
subplot(2,2,3)
plot(z,y)
title('图三:YOZ面投影')
grid on
xlabel('y轴');
ylabel('z轴');
 
subplot(2,2,4)
plot(x,y)
title('图四:XOY面投影')
grid on
xlabel('x轴');
ylabel('y轴');

程序3:血管的三维重建图像matlab程序代码

%% 第三问程序(五次曲线拟合后的血管三维图像)
% 
for t=0:99
    [x,y,z]=sphere(50);  % 生成球体
    % 返回大小为(n+1)*(n+1)的三个矩阵中n×n球体的坐标。用surf(X,Y,Z)或mesh(X,Y,Z)绘制球体。
    x=-1.645e-07.*t.^5+9.822e-06.*t.^4+0.002147.*t.^3-0.1358.*t.^2+2.19.*t-167.5+29.4167.*x;
    % 最高次为五次时x与t的函数关系式
    y=5.47e-07.*t.^5-0.000142.*t.^4+0.01168.*t.^3-0.3354.*t.^2+4.308.*t-10.75+29.4167.*y;
    % 最高次为五次时y与t的函数关系式
    z = t  + 29.4167*z;
    % z与t的函数关系式
    surf(x,y,z);
    % 绘制球体
    hold on
    % 保持图像
end
%% 图像标注处理
shading interp  % 阴影插值函数
x = xlabel('x轴');
y = ylabel('y轴');
z = zlabel('z轴');
title('五次曲线拟合后的血管三维图像')

程序4 :三维重建后模型切片matlab程序代码

%% 截取重建后模型的切面源代码
R=29.4924;
z=1:100;
x=-1.645e-07.*(z-1).^5+9.822e-06.*(z-1).^4+0.002147.*(z-1).^3-0.1358.*(z-1).^2+2.19.*(z-1)-167.5;
% 最高次为五次时x与t的函数关系式
y=5.47e-07.*(z-1).^5-0.000142.*(z-1).^4+0.01168.*(z-1).^3-0.3354.*(z-1).^2+4.308.*(z-1)-10.75;
% 最高次为五次时y与t的函数关系式
for m=0:99  % m代表切片层数
a=ones(512,512);  %存储截面图象灰度矩阵,全1纯白
for i=1:512 % 通过遍历i、j、p来遍历空间所以点
    for j=1:512 
        for p=1:100          
            % 空间点的坐标位置遍历,血管内部的点肯定大于 (黑),外部(白)
            b(p)=sqrt(((i-257)-x(p))^2+((j-257)-y(p))^2+(m+1-p)^2); 
        end
        if min(b)<=R  % 当该点到同高度下中轴点的距离小于R时,即在血管内部
            a(i,j)=0; % 染成黑色
        end
    end
end
imwrite(a,strcat('C:\Users\许新立\Documents\MATLAB\第一次模拟',int2str(m),'.bmp'));
% 输出切片后的图像
end

程序5:原、新切片相似度对比matlab程序代码

%% 最后一小问程序 源代码
%% 原图与重建模型切面的相似度百分比
clear;
clc;
%% 导入原图像及切片后图像
I1=imread('C:\Users\许新立\Documents\MATLAB\第一次模拟\2001a\bmp\0.bmp'); %读取原切片//路径自行添加//
I2=imread('C:\Users\许新立\Documents\MATLAB\第一次模拟0.bmp'); % 读取新切片// 路径自行添加 //
I3=I1+im2bw(I2); % 二值化 (矩阵相加)
count_0=0; % 记录像素为0的点(黑点)
count_1=1; % 记录像素为1的点(白点)
[h,w]=size(I3); % 读取I3的尺寸
for i=1:h
    for j=1:w
        if I3(i,j)==0  %逐点比较相似
            count_0=count_0+1;
        elseif I3(i,j)==1  %逐点比较相似
            count_1=count_1+1;
        end
    end
end
similarity=double(count_0)/(count_0+count_1);
similarity;
%% 结果显示
%  0.bmp:similarity =
%     0.7651
% 30.bmp:similarity =
%     0.8818
% 60.bmp: similarity =
%     0.8881
% 90.bmp:similarity =
%     0.6928

程序6:提取任一切片图形轮廓matlab代码

%% 提取轮廓(0.bmp、30.bmp、60.bmp、90.bmp) 
a = imread('第一次模拟0.bmp')  % 读取新切片/自行添加路径/
b= bwmorph(a,'remove');   % 提取轮廓
for i =1:512    %遍历轮廓
    for j=1:512
        b(i,j)=1-b(i,j);  % 0—1互换
    end
end
imshow(b); % 显示去掉轮廓后的图像

 

©️2022 CSDN 皮肤主题:技术工厂 设计师:CSDN官方博客 返回首页

打赏作者

Ypuyu

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值