声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 5556|回复: 16

[图像处理] 求教:如何提取三维坐标!

[复制链接]
发表于 2011-5-4 08:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
我要提取 z=x.^2+y.^2 ;[x,y]=meshgrid(-2:0.1:2,-3:0.1:3);mesh(x,y,z);的三维坐标!
而且要将做坐标排成三列,每一行就是一个点的坐标。求教,望高人指点。急急!!!
回复
分享到:

使用道具 举报

 楼主| 发表于 2011-5-4 09:02 | 显示全部楼层
回复 1 # sunminmin 的帖子

我用xyz=[x;y;z]' 得不到将坐标排成三列的结果。还有就是如果xyz=.....得到将坐标排成三列保存进txt文件中,如何在matlab中读取这个txt文件显示和z=x.^2+y.^2一样的图形。望指点,我刚学matlab,谢谢
 楼主| 发表于 2011-5-4 09:06 | 显示全部楼层
回复 2 # sunminmin 的帖子

希望路过的也指点指点,不胜感激。帮我顶一下,谢谢。
发表于 2011-5-5 00:02 | 显示全部楼层
本帖最后由 meiyongyuandeze 于 2011-5-5 00:04 编辑

直接画图及可以,不明白为什么要写成那种形式呢?如果真的需要,应该实现起来不难!
发表于 2011-5-5 00:03 | 显示全部楼层
回复 3 # sunminmin 的帖子
  1. clc
  2. clear
  3. [x,y]=meshgrid(-2:1:2,-3:1:3);
  4. z=x.^2+y.^2;
  5. mesh(x,y,z);
  6. [n,m]=size(x);
  7. xyz=[reshape(x,n*m,1) reshape(y,n*m,1) reshape(z,n*m,1)]
复制代码
结果:
  1. xyz =

  2.     -2    -3    13
  3.     -2    -2     8
  4.     -2    -1     5
  5.     -2     0     4
  6.     -2     1     5
  7.     -2     2     8
  8.     -2     3    13
  9.     -1    -3    10
  10.     -1    -2     5
  11.     -1    -1     2
  12.     -1     0     1
  13.     -1     1     2
  14.     -1     2     5
  15.     -1     3    10
  16.      0    -3     9
  17.      0    -2     4
  18.      0    -1     1
  19.      0     0     0
  20.      0     1     1
  21.      0     2     4
  22.      0     3     9
  23.      1    -3    10
  24.      1    -2     5
  25.      1    -1     2
  26.      1     0     1
  27.      1     1     2
  28.      1     2     5
  29.      1     3    10
  30.      2    -3    13
  31.      2    -2     8
  32.      2    -1     5
  33.      2     0     4
  34.      2     1     5
  35.      2     2     8
  36.      2     3    13
复制代码
应该没问题!
 楼主| 发表于 2011-5-5 18:14 | 显示全部楼层
回复 5 # meiyongyuandeze 的帖子

谢谢!是正确的。我用matlab做随机地形图的生成,想把其中一幅地形图map1的坐标保存进txt文件中,然后利用vc++与matlab混合编程,利用matlab引擎,读取txt文件生成地形图map1。把x,y,z排成三列(即每一行为一个点的坐标)存进txt中,方便在vc++中读取。
 楼主| 发表于 2011-5-5 18:19 | 显示全部楼层
回复 6 # sunminmin 的帖子

生成固定的地形图map1,下一步在map1中绘制轨迹图,我想用vc++和matlab混合编程通过matlab引擎做一个简单的轨迹规划。
发表于 2011-5-5 19:33 | 显示全部楼层
回复 7 # sunminmin 的帖子

祝好运,呵呵!
 楼主| 发表于 2011-5-6 20:28 | 显示全部楼层
如何获取下面3个m文件生成的三维地形图的坐标(x,y,z)信息??
生成三维随机地形图的代码,用matlab实现:
CeatHill.m文件
  1. function [data]=CeatHill(N,h,x0,y0,xi,yi,num)
  2. %创建小山丘模型,N座山,H为山的高度,X0,Y0为山的坐标。XI,YI为山丘的斜度,NUM为山丘模型数据的维数。
  3. %XI,YI的值越大,山丘就越平坦
  4. % Example:
  5. %          tic;
  6. %          h=[20,60,40];
  7. %          x0=[20,40,50];
  8. %          y0=[20,50,60];
  9. %          xi=[];
  10. %          yi=[];
  11. %          d=CeatHill(3,h,x0,y0,xi,yi,65);
  12. %          colormap(gray); %设置渲染的颜色
  13. %          surf(d); %画出三维曲面
  14. %          shading flat; %各小曲面之间不要网格
  15. %          toc %测试运行时间
  16. x=1:1:num;y=1:1:num;
  17. %z2=zeros(1,4);
  18. for m=1:num
  19.     for n=1:num
  20.         Sum=0;
  21.         for k=1:N
  22.             s=h(k)*exp(-((x(m)-x0(k))/xi(k))^2-((y(n)-y0(k))/yi(k))^2);
  23.             Sum=Sum+s;
  24.         end
  25.         data(m,n)=Sum;
  26.     end
  27. end
复制代码
SquareDiamond.m文件
  1. function [data]=SquareDiamond(N,initvalue,c)
  2. %输入N为:方阵的维数2^N+1,在方阵的四个角的顶点上放置的初值,
  3. %这里定为四个初值一样
  4. % Example:
  5. %          tic;
  6. %          d=SquareDiamond(8,5,0.5);
  7. %          colormap(gray); %设置渲染的颜色
  8. %          surf(d); %画出三维曲面
  9. %          shading flat; %各小曲面之间不要网格
  10. %          toc %测试运行时间

  11. n=2^N;
  12. data=zeros(n+1);
  13. data(1,1)=initvalue;
  14. data(1,n+1)=initvalue;
  15. data(n+1,1)=initvalue;
  16. data(n+1,n+1)=initvalue;
  17. data=mytry(data,n,c,n);

  18. function [x]=rnd(absvalue)
  19. %扩展的随机函数生成器,产生绝对值小于absvalue的随机实数
  20. x=(rand(1)-0.5)*2*absvalue;

  21. function [data]=mytry(data,m,r,n)
  22. %square=========================================
  23. %x-------x
  24. %---------
  25. %-- 0 -- 由四个x定中间的0
  26. %---------
  27. %x-------x
  28. for i=1:m:n
  29. for j=1:m:n
  30. data((i+i+m)/2,(j+j+m)/2)=(data(i,j)+data(i,j+m)+data(i+m,j)+data(i+m,j+m))/4+rnd(r);
  31. end
  32. end
  33. %diamond========================================
  34. %----x--
  35. %-----
  36. %x- 0 -x 由四个x定中间的0
  37. %--------
  38. %----x---

  39. %钻石步骤的横向部分
  40. %line No.1
  41. for j=1+m/2:m:n
  42. data(1,j)=(data(1,j+m/2)+data(1+m/2,j)+data(1,j-m/2)+data(n+1-m/2,j))/4+rnd(r);
  43. end
  44. %middle
  45. for i=1+m:m:n
  46. for j=1+m/2:m:n
  47. data(i,j)=(data(i,j+m/2)+data(i+m/2,j)+data(i,j-m/2)+data(i-m/2,j))/4+rnd(r);
  48. end
  49. end
  50. %line last
  51. for j=1+m/2:m:n
  52. data(n+1,j)=(data(n+1,j+m/2)+data(1+m/2,j)+data(n+1,j-m/2)+data(n+1-m/2,j))/4+rnd(r);
  53. end

  54. %钻石步骤的纵向部分
  55. %line No.1
  56. for i=1+m/2:m:n
  57. data(i,1)=(data(i,1+m/2)+data(i+m/2,1)+data(i,n+1-m/2)+data(i-m/2,1))/4+rnd(r);
  58. end
  59. %middle
  60. for i=1+m/2:m:n
  61. for j=1+m:m:n
  62. data(i,j)=(data(i,j+m/2)+data(i+m/2,j)+data(i,j-m/2)+data(i-m/2,j))/4+rnd(r);
  63. end
  64. end
  65. % line last
  66. for i=1+m/2:m:n
  67. data(i,n+1)=(data(i,1+m/2)+data(i+m/2,n+1)+data(i,n+1-m/2)+data(i-m/2,n+1))/4+rnd(r);
  68. end

  69. if (m>2)
  70. data=mytry(data,m/2,r/2,n); %递归
  71. end
复制代码
createmap.m文件
  1. clc
  2. clear all
  3. close all
  4. %map1 随机地表。
  5. Z1=SquareDiamond(6,2,8);
  6. figure(1);
  7. surf(Z1); %画出三维曲面
  8. shading flat; %各小曲面之间不要网格
  9. %map2 山峰图
  10. h=[20,35,25];
  11. x0=[10,40,45];
  12. y0=[10,25,50];
  13. xi=[5.5,8,5];
  14. yi=[5,7,6];
  15. Z2=CeatHill(3,h,x0,y0,xi,yi,65);
  16. figure(2);
  17. surf(Z2); %画出三维曲面
  18. shading flat; %各小曲面之间不要网格
  19. %map3 合成图
  20. Z3=max(Z1,Z2);
  21. figure(3);
  22. surf(Z3); %画出三维曲面
  23. shading flat; %各小曲面之间不要网格
复制代码

点评

[n,m]=size(z); [x,y]=meshgrid(xx,yy); xyz=[reshape(x,n*m,1) reshape(y,n*m,1) reshape(z,n*m,1)];  发表于 2011-5-13 08:51
[n,m]=size(z); [x,y]=meshgrid(xx,yy); xyz=[reshape(x,n*m,1) reshape(y,n*m,1) reshape(z,n*m,1)];  发表于 2011-5-13 08:50
meiyongyuandeze 的解决方法: figure_info=findall(gcf,'type','surf'); xx=get(figure_info,'xdata'); yy=get(figure_info,'ydata'); z=get(figure_info,'zdata'); [n,m]=size(z); [x,y]=meshgr   发表于 2011-5-13 08:45
发表于 2011-5-7 00:11 | 显示全部楼层
回复 9 # sunminmin 的帖子

程序比较长,我们外行人读起来还是比较恼火,楼主不如直接告诉我们你想提取那个图的坐标,这样目的性强点!
 楼主| 发表于 2011-5-7 00:29 | 显示全部楼层
回复 10 # meiyongyuandeze 的帖子

运行createmap.m文件会显示3副图,分别为随机地表图1、山峰图2、地表图与山峰图叠加生成的图3。我要读取图3的坐标。
 楼主| 发表于 2011-5-7 10:42 | 显示全部楼层
用readbmp.m能读取dx.bmp显示图形,为什么我把I=imread('dx.bmp'); %读入一幅图片改成I=imread('map.bmp'); 把gao=[0.1:0.1:0.7];[x1,y1]=meshgrid(1:0.1:5)做相应修改,还是不能读取map.bmp显示图形。提示??? Index exceeds matrix dimensions. Error in ==> dizhenyuce at 22   BW=II(:,:,1)+II(:,:,2)+II(:,:,3);

下面为readbmp.m文件:
I=imread('dx.bmp'); %读入一幅图片
%I=I(33:375,74:508,:); %须事先人工确定行标和列标

%提取坐标框内部分
I1=I(:,:,1); %提取红色灰度矩阵
pixel_black=(I1==0);
number_col=sum(pixel_black);
number_row=sum(pixel_black');
j1=find(number_col==max(number_col));
number_col(j1)=-1;
j2=find(number_col==max(number_col));

i1=find(number_row==max(number_row));
number_row(i1)=-1;
i2=find(number_row==max(number_row));
I=I(min(i1,i2):max(i1,i2),min(j1,j2):max(j1,j2),:);

%提取各等高线上颜色灰度值
II=I;
II(II==255)=0;
II(II>0)=255;
BW=II(:,:,1)+II(:,:,2)+II(:,:,3);
[row_id,col_id]=find(BW);
up_row_id=min(row_id);
up_col_id=col_id(round(mean(find(row_id==up_row_id))));
left_col_id=min(col_id);
left_row_id=row_id(round(mean(find(col_id==left_col_id))));
pixel_BW=BW(up_row_id:left_row_id,up_col_id);
row_id=find(pixel_BW)-1+up_row_id;
yanse(:,1:3)=I(row_id,up_col_id,:);
%yanse=[0 0 143;
% 0 47 255
% 0 223 255
% 143 255 111
% 255 207 0
% 255 31 0
% 127 0 0]; %须事先人工确定各等高线颜色灰度值,用到了getpts函数

[m,n]=size(I(:,:,1));
BW=zeros([m,n]);
x_xishu=4/(n-1);
y_xishu=4/(m-1);
gao=[0.1:0.1:0.7];

%提取各等高线上点的三维坐标
xyz=[];
for i=1:7
BW1=BW;
BW1(I(:,:,1)==yanse(i,1)&I(:,:,2)==yanse(i,2)&I(:,:,3)==yanse(i,3))=1;
[y,x]=find(BW1);
xyz=[xyz;1+(x-1)*x_xishu 1+(y-1)*y_xishu gao(i)*ones(size(x))];
end
xyz=xyz(1:3:end,:);
xyz=[xyz;1 1 0;1 2 0;1 3 0;1 4 0;1 5 0;2 1 0;3 1 0;4 1 0;5 1 0;5 2 0;5 3 0;5 4 0;5 5 0;2 5 0;3 5 0;4 5 0];
x=xyz(:,1);
y=xyz(:,2);
z=xyz(:,3);

%产生网格数据,进行散乱节点插值拟合
[x1,y1]=meshgrid(1:0.1:5)
z1=griddata(x,y,z,x1,y1,'v4');

[n,m]=size(x1);

xyz1=[reshape(x1,n*m,1) reshape(y1,n*m,1) reshape(z1,n*m,1)]


%画三维面图
figure
surf(x1,y1,z1)
shading flat; %各小曲面之间不要网格
zlim([0 0.8])
xlabel('X(单位:千米)')
ylabel('Y(单位:千米)')
zlabel('Z(单位:千米)')


dx.rar

7.96 KB, 下载次数: 1

dx.bmp

map.rar

19.51 KB, 下载次数: 1

map.bmp

 楼主| 发表于 2011-5-7 10:46 | 显示全部楼层
回复 11 # sunminmin 的帖子

怎样修改能读取任何.bmp文件显示图形?
 楼主| 发表于 2011-5-13 08:42 | 显示全部楼层
本帖最后由 sunminmin 于 2011-5-13 08:48 编辑

回复 9 # sunminmin 的帖子
谢谢大家能帮忙,还是要靠自己通过学习解决问题
发表于 2015-12-22 20:14 | 显示全部楼层
你会怎么从等高线图中提取三维坐标吗?
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-24 18:57 , Processed in 0.066510 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表