MATLAB中关于surf函数的使用
来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/11/08 06:18:30
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_data{i}=imread(filename(i).name);
gray_data{i}=double(image_data{i});
end
for i=1:20
x_last{i}=zeros(512,1); %定义最终三维坐标系中的x轴的坐标,实际上是1维列向量
y_last{i}=zeros(512,1); %定义最终三维坐标系中的y轴的坐标,实际上是1维列向量
z_last{i}=zeros(512,512); %定义最终三维坐标系中的z轴的坐标,实际上是512*512的矩阵
x_last{i}=(C(:,1)*cos(angle2(i,:)))/30+A0{i}(:,1);
y_last{i}=(C(:,2)*cos(angle1(i,:))+C(:,1)*sin(angle1(i,:))*sin(angle2(i,:)))/30+A0{i}(:,2);
for j=1:512
for k=1:512
z_last{i}(j,k)=(C(k,2)*sin(angle1(i,:))-C(j,1)*sin(angle2(i,:))*cos(angle1(i,:)))/30+A0{i}(1,3);
end
end
figure(i)
surf(x_last{i},y_last{i},z_last{i},gray_data{i})
end
其中的表达示不用管了,我觉得关键问题出在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_data{i}=imread(filename(i).name);
gray_data{i}=double(image_data{i});
end
for i=1:20
x_last{i}=zeros(512,1); %定义最终三维坐标系中的x轴的坐标,实际上是1维列向量
y_last{i}=zeros(512,1); %定义最终三维坐标系中的y轴的坐标,实际上是1维列向量
z_last{i}=zeros(512,512); %定义最终三维坐标系中的z轴的坐标,实际上是512*512的矩阵
x_last{i}=(C(:,1)*cos(angle2(i,:)))/30+A0{i}(:,1);
y_last{i}=(C(:,2)*cos(angle1(i,:))+C(:,1)*sin(angle1(i,:))*sin(angle2(i,:)))/30+A0{i}(:,2);
for j=1:512
for k=1:512
z_last{i}(j,k)=(C(k,2)*sin(angle1(i,:))-C(j,1)*sin(angle2(i,:))*cos(angle1(i,:)))/30+A0{i}(1,3);
end
end
figure(i)
surf(x_last{i},y_last{i},z_last{i},gray_data{i})
end
其中的表达示不用管了,我觉得关键问题出在surf语句上,
surf绘制的图像边是黑色的,你取512个点太密了,所以才看到一片黑,你可以取少一些采样点,一般不要超过100,或者用mesh绘制,它的边是有颜色的.还有一种方法是绘制后再加一句shading flat或shading interp
如果还有什么问题欢迎继续追问
再问: 弱弱地问一句,怎么把mesh的图变色啊……
再答: filename=dir('C:\MATLAB7\work\*.bmp'); k=length(filename); for i=1:k image_data{i}=imread(filename(i).name); gray_data{i}=double(image_data{i}); end for i=1:20 x_last{i}=zeros(512,1); %定义最终三维坐标系中的x轴的坐标,实际上是1维列向量 y_last{i}=zeros(512,1); %定义最终三维坐标系中的y轴的坐标,实际上是1维列向量 z_last{i}=zeros(512,512); %定义最终三维坐标系中的z轴的坐标,实际上是512*512的矩阵 x_last{i}=(C(:,1)*cos(angle2(i,:)))/30+A0{i}(:,1); y_last{i}=(C(:,2)*cos(angle1(i,:))+C(:,1)*sin(angle1(i,:))*sin(angle2(i,:)))/30+A0{i}(:,2); for j=1:512 for k=1:512 z_last{i}(j,k)=(C(k,2)*sin(angle1(i,:))-C(j,1)*sin(angle2(i,:))*cos(angle1(i,:)))/30+A0{i}(1,3); end end figure(i) surf(x_last{i},y_last{i},z_last{i},gray_data{i},'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之类的无损格式,应该不难查找。
再问: 能不能顺便说说用什么找啊,网上找了几个不大对,谢啦~我会再追加分数的~
如果还有什么问题欢迎继续追问
再问: 弱弱地问一句,怎么把mesh的图变色啊……
再答: filename=dir('C:\MATLAB7\work\*.bmp'); k=length(filename); for i=1:k image_data{i}=imread(filename(i).name); gray_data{i}=double(image_data{i}); end for i=1:20 x_last{i}=zeros(512,1); %定义最终三维坐标系中的x轴的坐标,实际上是1维列向量 y_last{i}=zeros(512,1); %定义最终三维坐标系中的y轴的坐标,实际上是1维列向量 z_last{i}=zeros(512,512); %定义最终三维坐标系中的z轴的坐标,实际上是512*512的矩阵 x_last{i}=(C(:,1)*cos(angle2(i,:)))/30+A0{i}(:,1); y_last{i}=(C(:,2)*cos(angle1(i,:))+C(:,1)*sin(angle1(i,:))*sin(angle2(i,:)))/30+A0{i}(:,2); for j=1:512 for k=1:512 z_last{i}(j,k)=(C(k,2)*sin(angle1(i,:))-C(j,1)*sin(angle2(i,:))*cos(angle1(i,:)))/30+A0{i}(1,3); end end figure(i) surf(x_last{i},y_last{i},z_last{i},gray_data{i},'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之类的无损格式,应该不难查找。
再问: 能不能顺便说说用什么找啊,网上找了几个不大对,谢啦~我会再追加分数的~