MATLAB的血管三维重建源代码

合集下载

matlab三维图代码

matlab三维图代码

1.generate grid[x,y] = meshgrid(x, y);read excel dataz1 = xlsread('data.xls');z1(1 , :) = [];z1(: , 1) = [];z = z1;change the rowsa = 1 : 21;a1 = 21 : -1 : 1;z(a, :) = z(a1, :);% mesh the resultfigure(1)mesh(x,y,z)plot the contourfigure(2)contour(x,y,z)colorbar2clear;clf;X=[1200 1600 2000 2400 2800 3200 3600 4000]; Y=[3600 3200 2800 2400 2000 1600 1200];%[X,Y]=meshgrid(x,y);Z=[1480 1500 1550 1510 1430 1300 1200 980 1500 1550 1600 1550 1600 1600 1600 1550 1500 1200 1100 1550 1600 1550 1380 1070 1500 1200 1100 1350 1450 1200 1150 1010 1390 1500 1500 1400 900 1100 1060 9501320 1450 1420 1400 1300 700 900 8501130 1250 1280 1230 1040 900 500 700];figure(1)subplot(2,2,1)contour(X,Y,Z,16)title('等高线1')xlabel('x-axis')ylabel('y-axis')subplot(2,2,3)contour3(X,Y,Z,16)title('等高线2')xlabel('x-axis')ylabel('y-axis') zlabel('z-axis') subplot(2,2,2)surf(X,Y,Z)title('地貌图1') xlabel('x-axis') ylabel('y-axis') zlabel('z-axis') subplot(2,2,4) surfc(X,Y,Z)title('地貌图2') xlabel('x-axis') ylabel('y-axis') zlabel('z-axis') figure(2)subplot(2,2,1) contour(X,Y,Z,16) title('等高线1') xlabel('x-axis') ylabel('y-axis') rotate3dsubplot(2,2,3) contour3(X,Y,Z,16) title('等高线2') xlabel('x-axis') ylabel('y-axis') zlabel('z-axis') rotate3dsubplot(2,2,2)surf(X,Y,Z)title('地貌图') xlabel('x-axis') ylabel('y-axis') zlabel('z-axis') rotate3dsubplot(2,2,4) surfc(X,Y,Z)title('地貌图2') xlabel('x-axis') ylabel('y-axis') zlabel('z-axis') rotate3dfigure(3)subplot(2,2,1)surf(X,Y,Z) title('地貌图1') xlabel('x-axis') ylabel('y-axis') zlabel('z-axis') subplot(2,2,2) surfc(X,Y,Z) title('地貌图2') xlabel('x-axis') ylabel('y-axis') zlabel('z-axis') subplot(2,2,3) surfl(X,Y,Z) title('地貌图3') xlabel('x-axis') ylabel('y-axis') zlabel('z-axis') figure(4) subplot(2,2,1) surf(X,Y,Z) title('地貌图1') xlabel('x-axis') ylabel('y-axis') zlabel('z-axis') rotate3d subplot(2,2,2) surfc(X,Y,Z) title('地貌图2') xlabel('x-axis') ylabel('y-axis') zlabel('z-axis') rotate3d subplot(2,2,3) surfl(X,Y,Z) title('地貌图3') xlabel('x-axis') ylabel('y-axis') zlabel('z-axis') rotate3d3% 读取图象数据到矩阵[A, map] = imread('input.bmp');% 得到图象信息info = imfinfo('input.bmp');w = info.Width;h = info.Height;% 创建与图象大小相对应的网格[x,y] = meshgrid(1:w,1:h);z = x - y + y - x;i = 1;j = 1;% 用图象灰度值填充高度值while (i - 1) * w + j <= w * hz(i,j) = A(i,j);j = j + 1;if j > wj = 1;i = i + 1;endend;% 绘制三维图象meshc(x,y,z);% 绘制表面surf(x,y,z,'FaceColor','interp','EdgeColor','none','FaceLighting','phong')。

matlab画三维图像的示例代码(附demo)

matlab画三维图像的示例代码(附demo)

matlab画三维图像的⽰例代码(附demo)当我们学习surface命令时,已经看到了三维作图的⼀些端倪。

在matlab中我么可以调⽤mesh(x,y,z)函数来产⽣三维图像。

⾸先,我们⽤z=cos(x)sin(y)在-2pi ≤x,y≤ 2pi内的图像来看看:[x,y] = meshgrid(-2*pi:0.1:2*pi);z = cos(x).*sin(y);mesh(x,y,z),xlabel('x'),ylabel('y'),zlabel('z')显⽰图像如下:同样⽤mesh命令产⽣z = ye-(x2+y2)的三维图像:[x,y] = meshgrid(-2:0.1:2);z = y.*exp(-x.^2-y.^2);mesh(x,y,z),xlabel('x'),ylabel('y'),zlabel('z')下⾯绘制表⾯带有渐变颜⾊的图像,可以通过 surf 和 surfc 命令实现,只要简单更改上⾯例⼦中的命令为:surf(x,y,z),xlabel('x'),ylabel('y'),zlabel('z')则图像如下所⽰,图像表⾯的颜⾊与⾼度是相称的:若使⽤surfc则会在图像中留下映像:surfc(x,y,z),xlabel('x'),ylabel('y'),zlabel('z')还可以调⽤surfl(命令中的'l'表⽰这是⼀个光照表⾯ lighted surface)命令显⽰三维光照物体的表⾯,可以使⽤这个命令产⽣没有线条的三维图像,图像还可以是彩⾊的或灰度的。

例如仍然产⽣函数z = ye-(x2+y2)的灰度图像,图像中的阴影可设置为flat、interp、faceted:surfl(x,y,z),xlabel('x'),ylabel('y'),zlabel('z')shading interp;colormap(gray);下⾯我们使⽤matlab内置函数来产⽣像球形或圆柱形这样的基本图像,例如:t = 0:pi/10:2*pi;[X,Y,Z] = cylinder(1+sin(t));surf(X,Y,Z),colormap('default');axis square会得到如下图像:试试另⼀个稍微有点不同的函数,阴影设置为faceted:t = 0:pi/10:2*pi;[X,Y,Z] = cylinder(1+cos(t));surf(X,Y,Z),shading faceted;axis square若将阴影设置为shading flat,则图像显⽰为:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

三维血管重建优秀论文含源代码

三维血管重建优秀论文含源代码

三维血管重建优秀论文含源代码Prepared on 21 November 2021血管的三维重建摘要本文探讨血管的三维重建,由血管的相继100张平行切片图像计算血管的中轴线与半径,并绘制血管在三个坐标平面上的投影。

由于血管的表面是由球心沿着某一曲线(称为中轴线)的球滚动包络而成,由此我们得出结论:每个切片一定包含滚动球的大圆,并且它一定为切片的最大内切圆,而最大圆所对应的半径即为血管半径,所以求血管半径就转化为求每一个切片内部的点到切片外部轮廓的最大半径。

首先,读取100张血管切面图,把它们转换成Logical矩阵,从中提取切片截面轮廓点构成一个新的矩阵。

然后找到原图片矩阵中像素点的内点(切片图片中轮廓线中的点),从而得到内点到切片轮廓点的最小距离矩阵和最小距离中的最大值矩阵,最大值即为血管半径。

最后计算所有切片的血管半径,并对这些半径求平均值,得到平均血管半径为:μm。

由100张切片的最大内切圆圆心坐标拟合得出中轴线方程以及其在三个坐标平面内的投影曲线方程。

由中轴线得到血管的三维立体重建图,用平面)74=iiZ去截血,0(,=2449,,管的三维立体重建图,得到新的4张截面图。

把它们分别与题设中的对应截面进行内点个数对比。

我们定义两张切片所共同拥有的内点个数与原切片内点个数的比值为重合度。

计算得到平均重合度为:% 。

关键词:血管半径中轴线切片重建(来自作者:欢迎各界人士批评指正,。

文章作于2011年8月10日,陕西科技大学理学院实验室)1问题的重述断面可用于了解生物组织、器官等的形态。

例如,将样本染色后切成厚约1μm的切片,在显微镜下观察该横断面的组织形态结构。

如果用切片机连续不断地将样本切成数十、成百的平行切片,可依次逐片观察。

根据拍照并采样得到的平行切片数字图象,运用计算机可重建组织、器官等准确的三维形态。

假设某些血管可视为一类特殊的管道,该管道的表面是由球心沿着某一曲线(称为中轴线)的球滚动包络而成。

CT图像三维重建(附源码)

CT图像三维重建(附源码)

程序流图:MATLAB 源码: clc;clear all;close all;% load mri %载入mri 数据,是matlab 自带库% ph = squeeze(D); %压缩载入的数据D ,并赋值给ph ph = phantom3d(128);prompt={'Enter the Piece num(1 to 128):'}; %提示信息“输入1到27的片的数字”name='Input number'; %弹出框名称defaultanswer={'1'}; %默认数字numInput=inputdlg(prompt,name,1,defaultanswer) %弹出框,并得到用户的输入信息 P= squeeze(ph(:,:,str2num(cell2mat(numInput))));%将用户的输入信息转换成数字,并从ph 中得到相应的片信息Pimshow(P) %展示图片PD = 250; %将D 赋值为250,是从扇束顶点到旋转中心的像素距离。

dsensor1 = 2; %正实数指定扇束传感器的间距2F1 = fanbeam(P,D,'FanSensorSpacing',dsensor1); %通过P ,D 等计算扇束的数据值 dsensor2 = 1; %正实数指定扇束传感器的间距1F2 = fanbeam(P,D,'FanSensorSpacing',dsensor2); %通过P ,D 等计算扇束的数据值dsensor3 = 0.25 %正实数指定扇束传感器的间距0.25 [F3, sensor_pos3, fan_rot_angles3] = fanbeam(P,D,...'FanSensorSpacing',dsensor3); %通过P ,D 等计算扇束的数据值,并得到扇束传感器的位置sensor_pos3和旋转角度fan_rot_angles3figure, %创建窗口imagesc(fan_rot_angles3, sensor_pos3, F3) %根据计算出的位置和角度展示F3的图片colormap(hot); %设置色图为hot colorbar; %显示色栏xlabel('Fan Rotation Angle (degrees)') %定义x 坐标轴ylabel('Fan Sensor Position (degrees)') %定义y 坐标轴output_size = max(size(P)); %得到P 维数的最大值,并赋值给output_size Ifan1 = ifanbeam(F1,D, ... 'FanSensorSpacing',dsensor1,'OutputSize',output_size);%根据扇束投影数据F1及D 等数据重建图像figure, imshow(Ifan1) %创建窗口,并展示图片Ifan1title('图一');disp('图一和原图的性噪比为:');result=psnr1(Ifan1,P);Ifan2 = ifanbeam(F2,D, ...'FanSensorSpacing',dsensor2,'OutputSize',output_size);%根据扇束投影数据F2及D 等数据重建图像figure, imshow(Ifan2) %创建窗口,并展示图片Ifan2disp('图二和原图的性噪比为:');result=psnr1(Ifan2,P);title('图二');Ifan3 = ifanbeam(F3,D, ...生成128的输入图片数字对图片信息进行预处用函数fanbeam 进行映射,得到扇束的数据,并用函数ifanbeam 根据扇束投影数据重建图像,并计算重建图像和原图的结束'FanSensorSpacing',dsensor3,'OutputSize',output_size);%根据扇束投影数据F3及D等数据重建图像figure, imshow(Ifan3) %创建窗口,并展示图片Ifan3title('图三');disp('图三和原图的性噪比为:');result=psnr1(Ifan3,P);function [p,ellipse]=phantom3d(varargin)%PHANTOM3D Three-dimensional analogue of MATLAB Shepp-Logan phantom% P = PHANTOM3D(DEF,N) generates a 3D head phantom that can% be used to test 3-D reconstruction algorithms.%% DEF is a string that specifies the type of head phantom to generate.% Valid values are:%% 'Shepp-Logan' A test image used widely by researchers in% tomography% 'Modified Shepp-Logan' (default) A variant of the Shepp-Logan phantom% in which the contrast is improved for better% visual perception.%% N is a scalar that specifies the grid size of P.% If you omit the argument, N defaults to 64.%% P = PHANTOM3D(E,N) generates a user-defined phantom, where each row% of the matrix E specifies an ellipsoid in the image. E has ten columns,% with each column containing a different parameter for the ellipsoids:%% Column 1: A the additive intensity value of the ellipsoid% Column 2: a the length of the x semi-axis of the ellipsoid% Column 3: b the length of the y semi-axis of the ellipsoid% Column 4: c the length of the z semi-axis of the ellipsoid% Column 5: x0 the x-coordinate of the center of the ellipsoid% Column 6: y0 the y-coordinate of the center of the ellipsoid% Column 7: z0 the z-coordinate of the center of the ellipsoid% Column 8: phi phi Euler angle (in degrees) (rotation about z-axis)% Column 9: theta theta Euler angle (in degrees) (rotation about x-axis) % Column 10: psi psi Euler angle (in degrees) (rotation about z-axis)%% For purposes of generating the phantom, the domains for the x-, y-, and % z-axes span [-1,1]. Columns 2 through 7 must be specified in terms% of this range.%% [P,E] = PHANTOM3D(...) returns the matrix E used to generate the phantom. %% Class Support% -------------% All inputs must be of class double. All outputs are of class double.%% Remarks% -------% For any given voxel in the output image, the voxel's value is equal to the% sum of the additive intensity values of all ellipsoids that the voxel is a% part of. If a voxel is not part of any ellipsoid, its value is 0.%% The additive intensity value A for an ellipsoid can be positive or negative;% if it is negative, the ellipsoid will be darker than the surrounding pixels.% Note that, depending on the values of A, some voxels may have values outside % the range [0,1].%% Example% -------% ph = phantom3d(128);% figure, imshow(squeeze(ph(64,:,:)))%% Copyright 2005 Matthias Christian Schabel (matthias @ stanfordalumni . org) % University of Utah Department of Radiology% Utah Center for Advanced Imaging Research% 729 Arapeen Drive% Salt Lake City, UT 84108-1218%% This code is released under the Gnu Public License (GPL). For more information, % see : /copyleft/gpl.html%% Portions of this code are based on phantom.m, copyrighted by the Mathworks %[ellipse,n] = parse_inputs(varargin{:});p = zeros([n n n]);rng = ( (0:n-1)-(n-1)/2 ) / ((n-1)/2);[x,y,z] = meshgrid(rng,rng,rng);coord = [flatten(x); flatten(y); flatten(z)];p = flatten(p);for k = 1:size(ellipse,1)A = ellipse(k,1); % Amplitude change for this ellipsoidasq = ellipse(k,2)^2; % a^2bsq = ellipse(k,3)^2; % b^2csq = ellipse(k,4)^2; % c^2x0 = ellipse(k,5); % x offsety0 = ellipse(k,6); % y offsetz0 = ellipse(k,7); % z offsetphi = ellipse(k,8)*pi/180; % first Euler angle in radianstheta = ellipse(k,9)*pi/180; % second Euler angle in radianspsi = ellipse(k,10)*pi/180; % third Euler angle in radianscphi = cos(phi);sphi = sin(phi);ctheta = cos(theta);stheta = sin(theta);cpsi = cos(psi);spsi = sin(psi);% Euler rotation matrixalpha = [cpsi*cphi-ctheta*sphi*spsi cpsi*sphi+ctheta*cphi*spsi spsi*stheta;-spsi*cphi-ctheta*sphi*cpsi -spsi*sphi+ctheta*cphi*cpsi cpsi*stheta;stheta*sphi -stheta*cphi ctheta];% rotated ellipsoid coordinatescoordp = alpha*coord;idx = find((coordp(1,:)-x0).^2./asq + (coordp(2,:)-y0).^2./bsq + (coordp(3,:)-z0).^2./csq <= 1);p(idx) = p(idx) + A;endp = reshape(p,[n n n]);return;function out = flatten(in)out = reshape(in,[1 prod(size(in))]);return;function [e,n] = parse_inputs(varargin)% e is the m-by-10 array which defines ellipsoids% n is the size of the phantom brain imagen = 128; % The default sizee = [];defaults = {'shepp-logan', 'modified shepp-logan', 'yu-ye-wang'};for i=1:narginif ischar(varargin{i}) % Look for a default phantomdef = lower(varargin{i});idx = strmatch(def, defaults);if isempty(idx)eid = sprintf('Images:%s:unknownPhantom',mfilename);msg = 'Unknown default phantom selected.';error(eid,'%s',msg);endswitch defaults{idx}case 'shepp-logan'e = shepp_logan;case 'modified shepp-logan'e = modified_shepp_logan;case 'yu-ye-wang'e = yu_ye_wang;endelseif numel(varargin{i})==1n = varargin{i}; % a scalar is the image size elseif ndims(varargin{i})==2 && size(varargin{i},2)==10e = varargin{i}; % user specified phantomelseeid = sprintf('Images:%s:invalidInputArgs',mfilename);msg = 'Invalid input arguments.';error(eid,'%s',msg);endend% ellipse is not yet definedif isempty(e)e = modified_shepp_logan;endreturn;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Default head phantoms: % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%function e = shepp_logane = modified_shepp_logan;e(:,1) = [1 -.98 -.02 -.02 .01 .01 .01 .01 .01 .01];return;function e = modified_shepp_logan%% This head phantom is the same as the Shepp-Logan except% the intensities are changed to yield higher contrast in% the image. Taken from Toft, 199-200.%% A a b c x0 y0 z0 phi theta psi% -----------------------------------------------------------------e = [ 1 .6900 .920 .810 0 0 0 0 0 0-.8 .6624 .874 .780 0 -.0184 0 0 0 0-.2 .1100 .310 .220 .22 0 0 -18 0 10-.2 .1600 .410 .280 -.22 0 0 18 0 10.1 .2100 .250 .410 0 .35 -.15 0 0 0.1 .0460 .046 .050 0 .1 .25 0 0 0.1 .0460 .046 .050 0 -.1 .25 0 0 0.1 .0460 .023 .050 -.08 -.605 0 0 0 0.1 .0230 .023 .020 0 -.606 0 0 0 0.1 .0230 .046 .020 .06 -.605 0 0 0 0 ];return;function e = yu_ye_wang%% Yu H, Ye Y, Wang G, Katsevich-Type Algorithms for Variable Radius Spiral Cone-Beam CT %% A a b c x0 y0 z0 phi theta psi% -----------------------------------------------------------------e = [ 1 .6900 .920 .900 0 0 0 0 0 0-.8 .6624 .874 .880 0 0 0 0 0 0-.2 .4100 .160 .210 -.22 0 -.25 108 0 0-.2 .3100 .110 .220 .22 0 -.25 72 0 0.2 .2100 .250 .500 0 .35 -.25 0 0 0.2 .0460 .046 .046 0 .1 -.25 0 0 0.1 .0460 .023 .020 -.08 -.65 -.25 0 0 0.1 .0460 .023 .020 .06 -.65 -.25 90 0 0.2 .0560 .040 .100 .06 -.105 .625 90 0 0-.2 .0560 .056 .100 0 .100 .625 0 0 0 ]; return;% func——计算两幅图像的psnr值function result=psnr1(in1,in2)z=mse(in1,in2);result=10*log10(255.^2/z)% plot(result)function z=mse(x,y)if ndims(x)==3x=rgb2gray(x);endif ndims(y)==3y=rgb2gray(y);endx=double(x);y=double(y);[m1,n1]=size(x);[m2,n2]=size(y);m=min(m1,m2);n=min(n1,n2);z=0;for i=1:mfor j=1:nz=z+(x(i,j)-y(i,j)).^2;endendz=z/(m*n);。

血管的三维重建论文(完结版)2

血管的三维重建论文(完结版)2

血管的三维重建摘要本文对于血管的三维重建问题,通过分析给定图片的像素数据,通过以下方法完成了血管的三维重建。

首先我们假定血管为等径管道,将血管看作半径不变的球沿着一条中轴线滚动形成。

根据题目中提供的100张BMP图片的像素点坐标数据,通过分析其几何特性,给出寻找其中轴线和半径的方法,由此找到每张图片中最大内切圆的圆心和半径,利用平均法,得到半径的平均值约为29.25 m.,即为管道半径。

接下来利用100个圆心的坐标利用最小二乘法拟合得到中轴线的方程:x t=7.9021t7−1.6321t6+0.1378t5−0.0056t4+0.0001t3y t=−2.9429t7+0.6330t6−0.0546t5+0.0023t4−0.0001t3z t=t通过对圆心坐标点绘制出的曲线与拟合后的曲线进行对比,发现拟合的曲线与得到的圆心坐标点非常吻合,从而更好的反映了中轴线上各点。

然后再用枚举法以得到的圆心坐标点为球心,画出100个球面上的点组成的还原图与100张切片的边界叠加成的还原图进行比对,形状相符,成功的还原了血管的三维图像。

关键词:血管;三维重建;像素;还原;最小二乘拟合;滚动法;枚举法1.问题的重述断面可用于了解生物组织、器官等的形态。

例如,将样本染色后切成厚约1 m的切片,在显微镜下可以观察该横断面的组织形态结构。

如果用切片机连续不断地将样本切成数十、成百的平行切片,可依次逐片观察。

根据拍照并采样得到的平行切片数字图象,运用计算机可重建组织、器官等准确的三维形态。

假设某些血管可视为一类特殊的管道,该管道的表面是由球心沿着某一曲线(称为中轴线)的球滚动包络而成。

例如圆柱就是这样一种管道,其中轴线为直线,由半径固定的球滚动包络形成。

现有某管道的相继100张平行切片图像,记录了管道与切片的交。

图像文件名依次为0.bmp、1.bmp、…、 99.bmp,格式均为BMP,宽、高均为512个像素(pixel)。

血管三维重建的数学模型

血管三维重建的数学模型

血管三维重建的数学模型刘俊健、吴友玲、徐勇哲[摘要]:本文探讨了血管的三维重建问题.我们首先利用数字图象处理的相关技术,从100张图中读取出相应数据,然后以定位所需的相关参数(包括中心轴线和半径)为目标,主要运用了包络面相关理论及几何拓扑网络中的相关知识得出了如下结论:切片一定包含一个滚动球的大圆,并且它恰好是切片内的最大圆.运用这些结论设计出有效的算法,利用数学软件(Matlab 及Maple)和计算机技术,对100个切片编程求解,找出切片所包含的最大圆,即得到中心轴线与100个切片交点的坐标及大圆半径.经过误差分析确定出管道半径为69849.29=r ,并给出了中心轴线上点的坐标,最后我们还绘制出中心轴线在zx yz xy ,,平面上的投影图.关键词:三维重建;最大圆;中轴线;有障碍物的最大空隙问题1 问题的提出生物组织连续切片的计算机三维重建技术是把一系列切片的图象,通过计算机进行处理,从而得到该生物组织立体结构的一种方法.在切片图象内部寻找定位结构,是此核技术的关键,同时也是目前国内外三维重建技术的共同难题.解决此难题的一个重要方向是通过提取切片中二维图象的数据信息,建立模型,以达到定位效果.假设某类血管表面可视为由球心沿着一曲线(称为中轴线)的球滚动包络而成.现有一此类血管相继100张平行切片图象,记录了管道与切片的交.图象格式为BMP,宽、高均为512个象素(pixel ).假设管道中轴线与每张切片有且只有一个交点,球半径固定,切片间距以及图象象素的尺寸均为1.如果取坐标系的Z 轴垂直于切片,第1张切片为平面0=Z ,第100张切片为平面99=Z .z Z =切片图象中象素在文件中出现的前后次序为 (-256,-256,z ),(-256,-255,z ),…(-256,255,z ), (-255,-256,z ),(-255,-255,z ),…(-255,255,z ), ……( 255,-256,z ),( 255,-255,z ),…(255,255,z ).试计算管道的中轴线与半径,给出具体的算法,并绘制中轴线在XY 、YZ 、ZX 平面的投影图.2 基本假设和符号说明1) 假设血管为实心体,其表面为一包络面;2) 假设管道中轴线与每张切片有且只有一个交点,滚动球的半径固定; 3) 假设切片间距以及图象的象素尺寸均为1; 4) m 表示中轴线,是一空间曲线; 5) r 表示滚动球的半径;6) S 表示球心沿中轴线滚动形成的包络面;7) V 表示由曲面S 与平面0=Z ,99=Z 所围成的管道体; 8) i F 表示管道体V 与平面i Z =的切片; 9) i e 表示i F 的边界.没有说明的符号在文中初次引用时均作出了说明.3 问题的分析与模型的建立首先分析题目中所给出的100张图片.对这100张黑白图片通过计算机图象处理,我们可以观察到其切片呈现一个旋转渐变的过程,如图(一)因此我们估计该血管的形状类似一条螺旋管.只要将这一百张切片在空间中定位,由于切片间距非常小(为一个象素),所以就可以近似地还原出血管的三维结构.现先对每张图作出一些数据上的分析.针对BMP 图象的存储格式,我们将所给的图片转为二值图象处理.所谓二值图象,就是只有黑白两个灰度级,即象素灰度级非1即0.我们可以从每张图中读取出一个512阶的0-1矩阵.其中0表示象素为黑色.1表示象素为白色.我们可以给出矩阵元素的位置与题目中所定坐标系之间的坐标变换.即矩阵的第i 行,第j 列的元素坐标相应转化为)256,257(i j --.现在我们把问题转化为数学语言.在笛卡尔坐标系内,有一半径为r 的球,沿空间的某一曲线m (称为中轴线),滚动包络形成空间曲面S ,现有100张平面图,99,,1,0===Z Z Z ,其中0Z ,99Z 与曲面S 围成一实心管道体,现题目就是要求我们求出该管道体的中轴线m 及滚动球的半径,并要给出中轴线m 在XY,YZ,ZX 平面上的内投影图.现设管道V 中轴线m 的方程为:⎪⎩⎪⎨⎧===)()()(t z z t y y t x x 其中99)(,0)(],,[990990==∈t Z t Z t t t 由于管道体中心轴线m 与每张切片有且只有一个交点,则不妨设中心轴m 与切片)990( =i F i 有且只有点)),(),((i t Y t X O i ,i Z 与1+i Z 的间距为1个象素,在如此小的间距下,我们可以用100个交点i O 近似地刻画中轴线.结论1:管道体V 与平面i Z =的切片i F 一定包含一个过滚动球球心,半径为r 的圆A . 现证明如下:以中心轴m 与平面i F 的唯一交点)),(),((i i Y t X O i 为球心(亦即包含一个滚动球的大圆),r 为半径所作出的球A 与平面i Z =交于圆A ,其中圆A 的半径为r ,由于球A 在管道体V 内,所以球A 与平面i Z =的切片也在管道体与i Z =的切片内,亦即圆在i F 内,结论1得证.结论2:管道体V 与平面i Z =的切片i F 内的最大圆恰好是滚动球中过球心半径为r 的圆A ,并且最大圆唯一.现证明如下: 由中轴线m 的方程:⎪⎩⎪⎨⎧===)()()(t Z z t Y y t X x ],[990t t t = )1( 其中99)(,0)(990==t Z t Z . 有曲面S (即包络面)的方程来:⎩⎨⎧=-+-+-=-+-+-0)('))(()('))(()('))(())(())(())((2222t Z t Z z t Y t Y y t X t X x r t Z z t Y y t X x )2(现考虑i Z =,取't t =使得i t Z =)'(则⎩⎨⎧=-+-=-+-0)('))(()('))(())'(())'((0000222t Y t Y y t X t X x r t Y y t X x )3( (3)式的几何意义是,在切片i F 的边界曲线i S 上的点与中轴线和切片的交点的最近距离为r ,即可作以))'(),'((t Y t X 为圆心,半径为r 的圆.边界曲线i S 和中轴线m 与切片i F 的交点)),(),((i t Y t X O i 的距离达到最大值r .又由于每一个i 属于集合{}99,,1,0 ,i z =与中轴线⎪⎩⎪⎨⎧===)()()(t Z z t Y y t X x 只有唯一交点,故只有唯一点t 满足i t Z =)(,所以切片包含的最大圆唯一.结论2得证.至此,我们只要在每个切片上找出一个能被切片i F 包含的最大圆的圆心,即为该切片与中轴线的交点.就一般包络面而言,切片的最大圆应是唯一的,但由于数据存储误差,我们可能会找到多于一个的最大圆.所以我们需要一个能找出多人最大圆的可行算法.利用以上的分析和结论,我们试图求出管道体半径r 及每个切片与中轴线的100个交点,由于BMP 存储方式的限制,每个切片实际是由有限多个点组成.我们利用几何拓扑网络中的有障碍物的最大空隙问题解法,把障碍物视为半径为0的圆,因此我们可以在切片上作如下约束优化:222)()(R s.t.Rmax i i y y x x ---=其中,i i i i F y x S y x ∈∈),( ),(i F 为管道体切片,i S 为i F 的边界,且i F 、i S 均为限点集.上述模型可简化为如下:))()((22i i y y x x Min Max r -+-=其中i i i i F y x S y x ∈∈),( ),( i F 为管道体切片,i S 为i F 的边界,且i F ,i S 均为限点集,关于r 的求解和圆心坐标,算法及求解结果将于下部分给出.4 模型的求解与算法的实现我们根据上面的在切片上进行约束优化思想,利用计算机编程来寻找最优解.由于切片图象是用BMP格式存储的,因此它都有是由一些有限的点构成,我们用Matlab读入每张图,用一个512⨯512的0-1矩阵表示,其中0表示象素为黑色的点.去掉所有非零元素,并记下所有零元素在矩阵中出现的位置,再转化为题中的笛卡儿坐标系的坐标,这样,就可以用描点方法作出切片的用点集表示的图,如果我们对100个切片上的点都在空间中描出来,那么就可以大体反映出管道体的三维结构.受图片存储的精度所限,只能在表示切片的点集上寻找最大圆心.我们根据上节中所列出来的约束优化思想,再利用计算机编程的方法来寻找最大圆.首先我们要作出切片的边界.由于图上的点都是呈阵列排布的,只要依次取切片上的点,选出与1相邻的0点即为切片的边界.现在按如下算法寻找最大圆的圆心和半径:1.取出切片点集中的一个点,再算出该点与边界上各点的距离,找出最小值,记为h,这就是以该点为圆心所能作出的包含于切片的最大圆的半径.2.继续取点集中的下一个点,再算出该点与边界上各点的距离,再找出最小值与 h进行比较,若比h大则把值赋给h,若与h相等则把值赋给h并记下坐标,同时还把这个点都记起来,这样就保证若最大圆不唯一,也可把所有最大圆找出来.3.取遍切片点集上的所有点运行第二步,最后得出的h即为该切片中最大圆的半径,相应该点的坐标即为切片与中轴线交点的坐标.().源程序见附录我们记每张切片上点的数目为n1,切片边界上点的数目为n2,显然n2远小于n1,我们要进行n1重循环,每一次循环作n2次比较,其复杂性不超过O()21n,所以,此算法为有效算法.我们用Matlab编程进行搜索,利用Matlab强大的矩阵运算功能,在编程时进行向量化,大大提高了程序的效率,对100张图分别算出如下半径和交点的坐标:注:上表中(X,Y,Z)表示与中轴线交点的笛卡儿坐标.R表示在切片上最大圆半径.由于图象精度问题及算法的误差.每张切片上算出的半径有微小差异,我们根据误差产生的原因进行分析(详细分析过程下节给出),取出所有半径中最大值r=29.69849,即为题目所要求的半径,把所得的100个中轴线上的点在空间中描出来,得到结果如图(二)所示:图(二)为了不影响最终结果的客观性和全面性,我们对数据可以不作任何拟合,以图表的方式给出结果,以供有需要人士随时查阅.我们已经求出中轴线上100个紧密的点,因此中轴线在XY,YZ,ZX平面上的投影应该是一些紧密的点,为直观起见,我们把这些点用线段连接起来,得到的投影图如下:在XY平面的投影在XZ平面的投影在YZ平面的投影5 结果分析由于BMP 图象是用点阵来表示的,用它读取出来的数据只能近似还原出原来的结构,因此得到的中轴线上的点必然有一定的误差,不过由于中轴线上的点非常密,作成的图表的效果也很不错.对于得到的100个半径的数据,我们取其中的最大值作为管道的半径,是基于如下的误差分析:由于程序算法可知,我们得到的最大圆的半径是切片点集中的所有点到边界点集的最短路距离中的最大值,所以由该点作出的圆不会超出切片的范围内,但由于我们找最大圆时,圆心都定在象素点上,而实际切片包含的最大圆的圆心可能不在象素点上,如图(三)所示:在正方形点集图上,每一个交点代表一个象素.我们取象素点为圆心找最大圆,只能找到半径为1的圆,其中中间的四个交点都可能是圆心,它实际包含的最大圆的半径应为1.5,圆心落在大正方形的中心点(非象素点)上.所以,当所得的大圆与切片只有一个切点时,大圆半径一定仍可以扩大,但所扩大的长度不会超过一个象素.而且有两段边界出现平行时,会出现不止一个最大圆圆心.而我们在程序中也考虑了进去,但并没有发现有出现这种情况.因此,只要提高图象的分辨率,便可减少误差.但由于点与点之间总有间隔.分辨率不可能无穷大,所以误差总是存在的.因此对于我们得出的100个半径值,我们取出其中最大值便是误差最小的,而我们这批数据找到的最大值为29.69849,最小值为28.86174,相差为0.83675,误差没有超过一个象素.CD图(三)6模型的改进与推广考虑到生物结构的完整性和连续性,我们当然希望得到的100个点能连成较为光滑的空间曲线,但实验数据在坐标平面上往往表现为一些离散的点.直接用这些观测点依序连结的折线来反映其变化情势常常过于粗糙.因此需要给出光滑的实验曲线,通常要求这条实验曲线与观测数据的残差平方和最小.对于本模型中的数据点,我们可作进一步的调整,从误差分析,我们可以知道许多切片上取得“最大圆”实质并非真正最大圆,但它必与已切片相切于一点,而与该点切线垂直的方向上的圆点,与切片的点相距应小于1个象素,所以其圆心可以适当向这个方向微调.经过调整修复后,我们还原出近似的三维血管图象如下:在误差分析时,我们发现误差很大程度上是由图象存储的精度决定的,只要数据足够精确,我们的模型将会得到更准确的结果,误差将会大大的减少.随着计算机技术的飞速发展和分辨电子显微学的发展,我们必能得出更为完善的结果.参考文献1.周培德、卢开澄. 计算几何. 北京:清华大学出版社.19992.夏良正.数学图象处理.南京:东南出版社. 1998.83.张宜华、史惠康.精通MA TLAB5. 北京:清华大学出版社.1999,64.李世奇、杜梦琴.计算机代数系统应用程序设计.重庆:重庆大学生出版社.1999.45.数学手册编写组.数学手册.北京:高等教育出版社.19796.何昆等.生物组织细胞连续切三维重建的研究进展. 军事医学科学院刊. 2000年第24卷北京.2000.3 编辑:许智杰方创彬。

MATLAB血管源代码

MATLAB血管源代码

附录1:图像二值矩阵的0-1互换的matlab程序代码(zhuanhua.m) function b0=zhuanhua(b0) %图像二值矩阵的0-1互换for i=1:512for j=1:512if b0(i,j)==1b0(i,j)=0;else b0(i,j)=1;endendend附录2:求各切片的最大内切圆的半径及圆心坐标matlab程序代码(ff.m) function [r, zhongxindian]=ff %输出各切片最大内切圆半径及圆心坐标a=zeros(512,512);b=zeros(512,512);for i=1:512for j=1:512a(i,j)=i-257; %横坐标的对应b(i,j)=j-257; %纵坐标的对应endend %图像在xyz面上的x轴、y轴坐标zhongxindian=zeros(100,2);r=zeros(100,1);for k=0:99t=strcat('f:/',int2str(i),'.bmp');b=imread(t);b=zhuanhua(b);%将01互换blunkuo=edge(b,'sobel');%提取轮廓bgujia=bwmorph(b,'skel',inf);%提取骨架%寻找内切圆[x0,y0,v0]=find(b0lunkuo);[a0,b0,c0]=find(b0gujia);m=length(a0);n=length(x0);juli=zeros(m,n);cunfang=zeros(m,2);for i=1:mfor j=1:np1=a0(i);q1=b0(i);p2=x0(j);q2=y0(j);juli(i,j)=sqrt((a(p1,q1)-a(p2,q2))^2+(b(p1,q1)-b(p2,q2))^2);%骨架上的各个点到轮廓的距离end[zx,zxxh]=min(juli(i,:));%骨架上一点到轮廓的最短距离即以骨架上各个点为圆心的内切园的半径cunfang(i,1)=zx;cunfang(i,2)=zxxh;end[zd,zdxh]=max(cunfang(:,1));%寻找半径中最大的半径和其对应的圆心坐标g=a0(zdxh);h=b0(zdxh);zhongxindian(k+1,1)=a(g,h);zhongxindian(k+1,2)=b(g,h);r(k+1)=zd;end附录3:通过计算不同次数多项式拟合的偏差平方和确定拟和次数的matlab程序代码(pczx.m)function j=pczx(z,t) %根据不同次数的多项式拟合与原图数据偏差平方和的大小来确定多项式拟和的次数delta=zeros(10,1);for k=1:10[p,s]=polyfit(z,t,k);delta(k)=s.normrend[i,j]=min(delta);附录4:根据轮廓画出血管的三维图像的matlab程序代码 for b=0:99 %提取原图的轮廓,根据轮廓画出血管的三维图像m1=imread([int2str(b),'.bmp']);m(:,:,b+1)=edge(m1,'sobel');endfor k=0:99for i=1:512for j=1:512if (m(i,j,k+1)==1)plot3(i,j,k+1,'r-.');hold onendendendendgrid ontitle('血管三维图')rotate3dhold off附录5:绘制中轴线及在各平面的投影图matlab程序代码 format longpx=polyfit(z,x,7);%x,z的7次多项式拟合x1=polyval(px,z);py=polyfit(z,y,5);%y,z的5次多项式拟合y1=polyval(py,z);figure(1); %画中心轴线图plot3(x1,y1,z)grid onxlabel('X轴');ylabel('Y轴');zlabel('Z轴');title('血管中轴线图');figure(2); %画中心轴线在xoz平面上的投影plot(z,x1,'-r')ylabel('Z轴');xlabel('X轴')title('血管中轴线XOZ平面投影图');grid onfigure(3);%画中心轴线在yoz平面上的投影plot(z,y1,'-b')xlabel('Z轴');ylabel('Y轴');title('血管中轴线YOZ平面投影图');grid onfigure(4);%画中心轴线在xoy平面上的投影plot(x1,y1,'-g')xlabel('X轴');ylabel('Y轴');title('血管中轴线XOY平面投影图');grid on附录6:求第pn张拟合图的轮廓的二值矩阵的matlab程序代码(dian.m) function pnjj=dian(px,py,pn) %输出pnjj,为第pn张拟合图片的轮廓二值矩阵a=zeros(991);b=zeros(991);q=zeros(991);w=zeros(991);r=zeros(1,2);s=zeros(1,2);k=1;for c=0:0.1:99a(k)=7*px(1)*c.^6+6*px(2)*c.^5+5*px(3)*c.^4+4*px(4)*c.^3+3*px(5)*c.^2+2*px(6)*c+px(7); b(k)=4*py(1)*c.^3+3*py(2)*c.^2+2*py(3)*c+py(4); %中心轴线方程关于z的导数即[a(k),b(k),1]为z在k处的切线的方向向量q(k)=px(1)*c.^7+px(2)*c.^6+px(3)*c.^5+px(4)*c.^4+px(5)*c.^3+px(6)*c.^2+px(7)*c+px(8);w(k)=py(1)*c.^5+py(2)*c.^4+py(3)*c.^3+py(4)*c.^2+py(5)*c; %中心轴线方程在z=k处的x,y值k=k+1;end%提取新的截痕u=[];v=[];syms x yk=1;for i=0:0.1:99m=a(k)*(x-q(k))+b(k)*(y-w(k))+(pn-i);n=(x-q(k))^2+(y-w(k))^2+(pn-i)^2-29.49^2;[g,h]=solve(m,n);r=double(g);s=double(h);if (abs(imag(r(1)))<0.01) %去除复数根u=[u;[real(r(1))+256 real(r(2))+256]];v=[v;[real(s(1))+256 real(s(2))+256]];endk=k+1;end%根据新的切平面的轮廓坐标得到新轮廓的图像矩阵plot(v(:,1),u(:,1),'r.',v(:,2),u(:,2),'r.')axis([0 512 0 512]);pnj=imread(strcat(int2str(pn),'.bmp'));lk=edge(pnj,'sobel');pnjj=zeros(512);u=round(u);v=round(v);for t=1:length(u(:,1))pnjj(u(t,1),v(t,1))=1;pnjj(u(t,2),v(t,2))=1;endfigure(1);%画原图轮廓imshow(lk)figure(2);%画新图轮廓imshow(pnjj)figure(3);%画原图与新图的轮廓图对比imshow(pnjj|lk)pnjj=zhuanhua(pnjj);附录7:求拟合图与原切片图的重合度的matlab程序代码(baifenbi1.m) function baifenbi=baifenbi1(pnjj,pn) %输出拟合图与原切片图的重合度%填充新图juzheng=pnjj; %pnjj为通过dian.m得到的轮廓边界二值矩阵%先填充左边界的右半部分for i=1:511for j=1:511if(pnjj(i,j)==0&pnjj(i,j+1)~=0)pnjj(i,j+1)=pnjj(i,j);endendendyou=pnjj;%再填充右边界的左半部分for i=1:512for j=512:-1:2if(juzheng(i,j)==0&juzheng(i,j-1)~=0)juzheng(i,j-1)=juzheng(i,j);endendendzuo=juzheng;shijijuzheng=you|zuo; %通过矩阵的或运算得到填充后的新图imshow(you|zuo)%原图的黑点的个数biaozhunjuzheng=imread(strcat(int2str(pn),'.bmp'));nbiao=0;for i=1:512for j=1:512if(biaozhunjuzheng(i,j)==0)nbiao=nbiao+1;endendend%新图与原图重合部分黑点的个数chonghegs=0;for i=1:512for j=1:512if(biaozhunjuzheng(i,j)==0&shijijuzheng(i,j)==0) chonghegs=chonghegs+1;endendend%求百分比baifenbi=chonghegs/nbiao;。

血管切片的三维重建

血管切片的三维重建

血管切片的三维重建
钱志刚;刘磊;王月娇
【期刊名称】《河北大学学报(自然科学版)》
【年(卷),期】2002(022)002
【摘要】为了利用血管切片图像重建血管的三维形态,首先用优化算法提取了图像信息,然后依据样条插值利用MATLAB建立了2个模型,进而重建了血管的三维形态,并对结果进行了分析与比较,验证了模型的正确性.
【总页数】6页(P118-123)
【作者】钱志刚;刘磊;王月娇
【作者单位】河北大学数学与计算机学院,河北,保定,071002;河北大学数学与计算机学院,河北,保定,071002;河北大学数学与计算机学院,河北,保定,071002
【正文语种】中文
【中图分类】O29
【相关文献】
1.血管连续切片图象的计算机三维重建 [J], 曹海峰;王晨光;孔亮;尹海东;孟军
2.基于切片图像的血管三维重建方法 [J], 韩西安;杨海涛;邱铭铭;赵东杰
3.血管切片的三维重建 [J], 柳海东;陈璐;江浩;卢钦和
4.利用切片的二维空间相关操作实现血管的三维重建 [J], 胡亦斌;向杰;程翔;王若鹏
5.基于切片二维图像的血管三维重建研究 [J], 靳瀛; 王敬前
因版权原因,仅展示原文概要,查看原文内容请购买。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

图片下载2001数学建模A题附录1:图像二值矩阵的0-1互换的matlab程序代码(zhuanhua.m)function b0=zhuanhua(b0) %图像二值矩阵的0-1互换for i=1:512for j=1:512if b0(i,j)==1b0(i,j)=0;else b0(i,j)=1;endendend附录2:求各切片的最大内切圆的半径及圆心坐标matlab程序代码(ff.m)function [r, zhongxindian]=ff %输出各切片最大内切圆半径及圆心坐标a=zeros(512,512);b=zeros(512,512);for i=1:512for j=1:512a(i,j)=i-257; %横坐标的对应b(i,j)=j-257; %纵坐标的对应endend %图像在xyz面上的x轴、y轴坐标zhongxindian=zeros(100,2);r=zeros(100,1);for k=0:99t=strcat('f:/',int2str(i),'.bmp');b=imread(t);b=zhuanhua(b);%将01互换blunkuo=edge(b,'sobel');%提取轮廓bgujia=bwmorph(b,'skel',inf);%提取骨架%寻找内切圆[x0,y0,v0]=find(b0lunkuo);[a0,b0,c0]=find(b0gujia);m=length(a0);n=length(x0);juli=zeros(m,n);cunfang=zeros(m,2);for i=1:mfor j=1:np1=a0(i);q1=b0(i);p2=x0(j);q2=y0(j);juli(i,j)=sqrt((a(p1,q1)-a(p2,q2))^2+(b(p1,q1)-b(p2,q2))^2);%骨架上的各个点到轮廓的距离end[zx,zxxh]=min(juli(i,:));%骨架上一点到轮廓的最短距离即以骨架上各个点为圆心的内切园的半径cunfang(i,1)=zx;cunfang(i,2)=zxxh;end[zd,zdxh]=max(cunfang(:,1));%寻找半径中最大的半径和其对应的圆心坐标g=a0(zdxh);h=b0(zdxh);zhongxindian(k+1,1)=a(g,h);zhongxindian(k+1,2)=b(g,h);r(k+1)=zd;end附录3:通过计算不同次数多项式拟合的偏差平方和确定拟和次数的matlab程序代码(pczx.m)function j=pczx(z,t) %根据不同次数的多项式拟合与原图数据偏差平方和的大小来确定多项式拟和的次数delta=zeros(10,1);for k=1:10[p,s]=polyfit(z,t,k);delta(k)=s.normrend[i,j]=min(delta);附录4:根据轮廓画出血管的三维图像的matlab程序代码for b=0:99 %提取原图的轮廓,根据轮廓画出血管的三维图像m1=imread([int2str(b),'.bmp']);m(:,:,b+1)=edge(m1,'sobel');endfor k=0:99for i=1:512for j=1:512if (m(i,j,k+1)==1)plot3(i,j,k+1,'r-.');hold onendendendendgrid ontitle('血管三维图')rotate3dhold off附录5:绘制中轴线及在各平面的投影图matlab程序代码format longpx=polyfit(z,x,7);%x,z的7次多项式拟合x1=polyval(px,z);py=polyfit(z,y,5);%y,z的5次多项式拟合y1=polyval(py,z);figure(1); %画中心轴线图plot3(x1,y1,z)grid onxlabel('X轴');ylabel('Y轴');zlabel('Z轴');title('血管中轴线图');figure(2); %画中心轴线在xoz平面上的投影plot(z,x1,'-r')ylabel('Z轴');xlabel('X轴')title('血管中轴线XOZ平面投影图');grid onfigure(3);%画中心轴线在yoz平面上的投影plot(z,y1,'-b')xlabel('Z轴');ylabel('Y轴');title('血管中轴线YOZ平面投影图');grid onfigure(4);%画中心轴线在xoy平面上的投影plot(x1,y1,'-g')xlabel('X轴');ylabel('Y轴');title('血管中轴线XOY平面投影图');grid on附录6:求第pn张拟合图的轮廓的二值矩阵的matlab程序代码(dian.m)function pnjj=dian(px,py,pn) %输出pnjj,为第pn张拟合图片的轮廓二值矩阵a=zeros(991);b=zeros(991);q=zeros(991);w=zeros(991);r=zeros(1,2);s=zeros(1,2);k=1;for c=0:0.1:99a(k)=7*px(1)*c.^6+6*px(2)*c.^5+5*px(3)*c.^4+4*px(4)*c.^3+3*px(5)*c.^2+2*px(6)*c+px(7);b(k)=4*py(1)*c.^3+3*py(2)*c.^2+2*py(3)*c+py(4); %中心轴线方程关于z的导数即[a(k),b(k),1]为z在k处的切线的方向向量q(k)=px(1)*c.^7+px(2)*c.^6+px(3)*c.^5+px(4)*c.^4+px(5)*c.^3+px(6)*c.^2+px(7)*c+px(8);w(k)=py(1)*c.^5+py(2)*c.^4+py(3)*c.^3+py(4)*c.^2+py(5)*c; %中心轴线方程在z=k处的x,y 值k=k+1;end%提取新的截痕u=[];v=[];syms x yk=1;for i=0:0.1:99m=a(k)*(x-q(k))+b(k)*(y-w(k))+(pn-i);n=(x-q(k))^2+(y-w(k))^2+(pn-i)^2-29.49^2;[g,h]=solve(m,n);r=double(g);s=double(h);if (abs(imag(r(1)))<0.01) %去除复数根u=[u;[real(r(1))+256 real(r(2))+256]];v=[v;[real(s(1))+256 real(s(2))+256]];endk=k+1;end%根据新的切平面的轮廓坐标得到新轮廓的图像矩阵plot(v(:,1),u(:,1),'r.',v(:,2),u(:,2),'r.')axis([0 512 0 512]);pnj=imread(strcat(int2str(pn),'.bmp'));lk=edge(pnj,'sobel');pnjj=zeros(512);u=round(u);v=round(v);for t=1:length(u(:,1))pnjj(u(t,1),v(t,1))=1;pnjj(u(t,2),v(t,2))=1;endfigure(1);%画原图轮廓imshow(lk)figure(2);%画新图轮廓imshow(pnjj)figure(3);%画原图与新图的轮廓图对比imshow(pnjj|lk)pnjj=zhuanhua(pnjj);附录7:求拟合图与原切片图的重合度的matlab程序代码(baifenbi1.m)function baifenbi=baifenbi1(pnjj,pn) %输出拟合图与原切片图的重合度%填充新图juzheng=pnjj; %pnjj为通过dian.m得到的轮廓边界二值矩阵%先填充左边界的右半部分for i=1:511for j=1:511if(pnjj(i,j)==0&pnjj(i,j+1)~=0)pnjj(i,j+1)=pnjj(i,j);endendendyou=pnjj;%再填充右边界的左半部分for i=1:512for j=512:-1:2if(juzheng(i,j)==0&juzheng(i,j-1)~=0)juzheng(i,j-1)=juzheng(i,j);endendendzuo=juzheng;shijijuzheng=you|zuo; %通过矩阵的或运算得到填充后的新图imshow(you|zuo)%原图的黑点的个数biaozhunjuzheng=imread(strcat(int2str(pn),'.bmp'));nbiao=0;for i=1:512for j=1:512if(biaozhunjuzheng(i,j)==0)nbiao=nbiao+1;endendend%新图与原图重合部分黑点的个数chonghegs=0;for i=1:512for j=1:512if(biaozhunjuzheng(i,j)==0&shijijuzheng(i,j)==0)chonghegs=chonghegs+1;endendend%求百分比baifenbi=chonghegs/nbiao;。

相关文档
最新文档