MATLAB中关于surf函数的使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB中关于surf函数的使用相关的知识,希望对你有一定的参考价值。

我在做毕设,初用MATLAB,题目是血管的三维重建,想要把一个二维的图通过坐标变换放入三维坐标系中的某个位置上,现在用到surf(x,y,z,c)函数.x是512*1,y是512*1,c是512*512,c是512*512的一个图的灰度,但是程序结果输出的图是全黑的,不知道哪里错了。我选了一个关键步骤。谢谢了~~
filename=dir('C:\MATLAB7\work\*.bmp');
k=length(filename);
for i=1:k
image_datai=imread(filename(i).name);
gray_datai=double(image_datai);
end
for i=1:20
x_lasti=zeros(512,1); %定义最终三维坐标系中的x轴的坐标,实际上是1维列向量
y_lasti=zeros(512,1); %定义最终三维坐标系中的y轴的坐标,实际上是1维列向量
z_lasti=zeros(512,512); %定义最终三维坐标系中的z轴的坐标,实际上是512*512的矩阵
x_lasti=(C(:,1)*cos(angle2(i,:)))/30+A0i(:,1);
y_lasti=(C(:,2)*cos(angle1(i,:))+C(:,1)*sin(angle1(i,:))*sin(angle2(i,:)))/30+A0i(:,2);
for j=1:512
for k=1:512
z_lasti(j,k)=(C(k,2)*sin(angle1(i,:))-C(j,1)*sin(angle2(i,:))*cos(angle1(i,:)))/30+A0i(1,3);
end
end
figure(i)
surf(x_lasti,y_lasti,z_lasti,gray_datai)
end
其中的表达示不用管了,我觉得关键问题出在surf语句上,再说句谢谢啦~~

参考技术A 用ezmesh画即可。
ezmesh('120/11/x^2*((1+(1/2-1/x^2)*(y*cosh(x)+x*sinh(x)-y))/x/(y*sinh(x)+x*cosh(x))*(cosh(x)-1)+(1/2-1/x^2)*(1-sinh(x)/x)-1/6)')
参考技术B surf绘制的图像边是黑色的,你取512个点太密了,所以才看到一片黑,你可以取少一些采样点,一般不要超过100,或者用mesh绘制,它的边是有颜色的。还有一种方法是绘制后再加一句shading flat或shading interp
如果还有什么问题欢迎继续追问追问

弱弱地问一句,怎么把mesh的图变色啊……

追答

filename=dir('C:\MATLAB7\work\*.bmp');
k=length(filename);
for i=1:k
image_datai=imread(filename(i).name);
gray_datai=double(image_datai);
end
for i=1:20
x_lasti=zeros(512,1); %定义最终三维坐标系中的x轴的坐标,实际上是1维列向量
y_lasti=zeros(512,1); %定义最终三维坐标系中的y轴的坐标,实际上是1维列向量
z_lasti=zeros(512,512); %定义最终三维坐标系中的z轴的坐标,实际上是512*512的矩阵
x_lasti=(C(:,1)*cos(angle2(i,:)))/30+A0i(:,1);
y_lasti=(C(:,2)*cos(angle1(i,:))+C(:,1)*sin(angle1(i,:))*sin(angle2(i,:)))/30+A0i(:,2);
for j=1:512
for k=1:512
z_lasti(j,k)=(C(k,2)*sin(angle1(i,:))-C(j,1)*sin(angle2(i,:))*cos(angle1(i,:)))/30+A0i(1,3);
end
end
figure(i)
surf(x_lasti,y_lasti,z_lasti,gray_datai,'facecolor','texturemap');
shading flat;
colormap gray
end

还有说一下,其实绘图时矩阵xyz的尺寸和颜色矩阵c的尺寸可以不同的,而且c也不用一定是double型的,uint8型的图像矩阵也是可以的,下面是例子
A=imread('peppers.png');%这个图matlab应该自带的
[x,y,z]=peaks;%xyz和A的尺寸不同
imshow(A);figure;
surf(x,y,z,A,'facecolor','texturemap');shading flat

追问

我在一个图像上用画图画了一些红线,想把这些红线提取出来,但是现在的问题是我用imread imshow显示出来的图像总是黑白的,让我也没法提取他们的像素。请问这是为什么,弄了一晚上了,显示其他的图像还挺正常的,这个不知道怎么回事,能不能顺便告诉我这些红线怎么提取出来啊~~谢啦~~

追答

可能是你保存有问题吧,你用其它的图片查看工具比如Acdsee之类的打开也是黑白的吗?
提红色只要找值为(255,0,0)的位置即可,如果你用的是纯红色画线,并且保存为bmp或png之类的无损格式,应该不难查找。

追问

能不能顺便说说用什么找啊,网上找了几个不大对,谢啦~我会再追加分数的~

本回答被提问者采纳

MATLAB画图surf函数颜色控制参数c用法

专业今年开了MATLAB的课程(土木工程学MATLAB?技术分享),老师给出了保过题,为了不挂科也是苦逼百度+谷歌了半天,加上自己的琢磨,总算是明白些surf颜色控制方法了,在这里分享记录一下~初学matlab,理解的不是太深,望海涵。

题目

excel中读取粒子,这些粒子具有三维的坐标,xyz,并且具有三维的速度,excel中的每一页内存储一个时间点的例子信息,xyzvxvyvz,页的命名为sheet+i,希望能够先读取粒子信息到向量当中,然后粒子的位置进行图像显示,粒子采用球体进行显示,球体的颜色和合速度的大小有关,采用从绿色到红色的渐变关系,然后粒子在三维空间中,根据时间的变化运动起来。

说明:我希望时间步数是作为函数的输入参数的,也就是显示多少个时间点是可控的,起始的时间点是可控的

从我多年编程的角度,嗯,逻辑非常简单,但是动画这块就比较蛋疼了,毕竟完全没接触过matlab动画~于是开始在网上搜相关的教程,这些东西还是挺多的。然后就做成了生成一个球并使其运动的代码,然后hold on绘制多个球。

然后就是颜色控制,第一想法就是使用colormap,用了之后就发现后面设置的会覆盖之前的,就是所有球都是同一颜色,,,。

之后继续搜,发现surf(x,y,z,c)的第四个参数就是颜色控制,,,但是搜了好多都说是颜色控制,就是不说到底怎么控制,,这就比较尴尬了。

于是在调试中和搜索中,发现错误提示 cDATA必须是M*N矩阵或者M*N*3数组,而c的默认值为z,,,那么不得不去联想,surf函数是使用网格绘制,c对应每一个网格的颜色,那也就是每个网格可以使用rgb进行颜色设置。那么设置一个和z同大小的矩阵,然后升级为三维数组,第三维(列)对应rgb三色,传给surf函数,那么正好实现了颜色控制。于是测试(以下为代码片段,无上下文)

[x,y,z] = sphere(n);

c=zeros(size(x));%获得o阵大小和x相同

for i=1:1:length(c(1,:))
  for j=1:1:length(c(:,1))
    c(i,j,1)=1;
    c(i,j,2)=0;
    c(i,j,3)=0;%红色
  end
end

没问题,所有球都是红的

那么题目就迎刃而解了

function anim=ani2(numb,start)
dian=[];
v=[];
i=1;
vmax=0;
vmin=100;
while 1
  lsp=xlsread(‘dian.xlsx‘,i);
  if length(lsp)==0
    break;
  end
  lsp(1)=lsp(1)+lsp(4)*start;
  lsp(2)=lsp(2)+lsp(5)*start;
  lsp(3)=lsp(3)+lsp(6)*start;
  dian=[dian;lsp(1),lsp(2),lsp(3)];
  v=[v;lsp(4),lsp(5),lsp(6)];
  lsv=sqrt(lsp(4)*lsp(4)+lsp(5)*lsp(5)+lsp(6)*lsp(6));
  if lsv>vmax
    vmax=lsv;
  end
  if lsv<vmin
    vmin=lsv;
  end
  i=i+1;
end

k = 5;
n = 2^k-1;
[x,y,z] = sphere(n);
for i=1:1:length(dian(:,1))
  surf(x+dian(i,1),y+dian(i,2),z+dian(i,3));
  hold on;
end
axis equal
axis tight
set(gcf,‘renderer‘,‘zbuffer‘);
set(gca,‘nextplot‘,‘replacechildren‘);
title(‘球体动画‘);
j_color=vmax-vmin;
for j=1:1:numb
  k = 5;
  n = 2^k-1;
  [x,y,z] = sphere(n);
  set(gca,‘nextplot‘,‘replacechildren‘);
  for i=1:1:length(dian(:,1))
    dian(i,1)=dian(i,1)+v(i,1);
    dian(i,2)=dian(i,2)+v(i,2);
    dian(i,3)=dian(i,3)+v(i,3);
    g=1-(sqrt(v(i,1)*v(i,1)+v(i,2)*v(i,2)+v(i,3)*v(i,3))-vmin)/j_color;
    r=1-g;
    c=zeros(size(z));
    for ll=1:1:length(c(1,:))
      for j=1:1:length(c(:,1))
        c(ll,j,1)=r;
        c(ll,j,2)=g;
        c(ll,j,3)=0;
      end
    end
    surf(x+dian(i,1),y+dian(i,2),z+dian(i,3),c);
    hold on;
  end
  axis equal
  F(j)=getframe;
end

希望对大家使用surf时有所帮助~

以上是关于MATLAB中关于surf函数的使用的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB中关于solve函数的用法

matlab surf函数的使用

matlab中surf啥意思

matlab踩坑 自带surf 函数找不了 surf 作为函数执行

Matlab中关于sprintf的问题

matlab 中关于fread函数的用法