声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 14802|回复: 13

[图像处理] matlab 怎么分别提取figure子图中曲线的数据

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

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

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

x
QQ截图未命名.jpg lh=findall(gca,'type','line'); % 从当前图(gca)中取出曲线的handle
xc=get(lh,'xdata'); % 取出x轴数据,注意,这个x和y是以cell的数据结构保存的
yc=get(lh,'ydata');
这样只能得到第二条线上的数据
回复
分享到:

使用道具 举报

发表于 2011-4-22 00:40 | 显示全部楼层
回复 1 # lxx244lxx 的帖子

看了下help文件,并做了个例子,代码如下:

  1. clc;clear
  2. x=1:10;
  3. y1=x.^2;
  4. y2=x.^3;
  5. subplot(2,1,1)
  6. plot(x,y1)
  7. subplot(2,1,2)
  8. plot(x,y2)
  9. figure_info=findall(gcf,'type','line');
  10. xc1=get(figure_info(1,:),'xdata')
  11. xc2=get(figure_info(2,:),'xdata')
  12. yc1=get(figure_info(1,:),'ydata')
  13. yc2=get(figure_info(2,:),'ydata')
复制代码
untitled.jpg
运行的结果:
  1. xc1 =
  2. 1 2 3 4 5 6 7 8 9 10
  3. xc2 =
  4. 1 2 3 4 5 6 7 8 9 10
  5. yc1 =
  6. 1 8 27 64 125 216 343 512 729 1000
  7. yc2 =
  8. 1 4 9 16 25 36 49 64 81 100
复制代码

这样就可以将所有子图中的曲线信息都找出来。
对比了findall help文件,其中findall中的handle_list可以是一下几种:
gcf 返回当前Figure对象的句柄值
gca返回当前axes对象的句柄值
gco返回当前鼠标单击的句柄值,该对象可以是除root对象外的 任意图形对象,并且Matlab会把当前图形对象的句柄值存放在Figure的CurrentObject属性中。




评分

1

查看全部评分

 楼主| 发表于 2011-4-22 09:40 | 显示全部楼层
回复 2 # meiyongyuandeze 的帖子

谢谢啊,将gca改成gcf就行了,对了,如果想在曲线上取100个点或几十个点又改怎么设定呢
发表于 2011-4-22 09:55 | 显示全部楼层
  1. figure_info=findall(gcf,'type','line');
  2. xc1=get(figure_info(1,:),'xdata')
  3. xx=xc1(N:M)
复制代码
M-N是你要取的个数!

评分

1

查看全部评分

发表于 2011-5-8 17:39 | 显示全部楼层
回复 2 # meiyongyuandeze 的帖子

曲线可以提取出坐标,三维图该如何提取?
生成这个三维图的代码:
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
  28. xlabel('X(单位:千米)')
  29. ylabel('Y(单位:千米)')
  30. zlabel('Z(单位:千米)')

复制代码

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. xlabel('X(单位:千米)')
  10. ylabel('Y(单位:千米)')
  11. zlabel('Z(单位:千米)')
  12. %map2 山峰图
  13. h=[20,35,25];
  14. x0=[10,40,45];
  15. y0=[10,25,50];
  16. xi=[5.5,8,5];
  17. yi=[5,7,6];
  18. Z2=CeatHill(3,h,x0,y0,xi,yi,65);
  19. figure(2);
  20. surf(Z2); %画出三维曲面
  21. shading flat; %各小曲面之间不要网格
  22. xlabel('X(单位:千米)')
  23. ylabel('Y(单位:千米)')
  24. zlabel('Z(单位:千米)')
  25. %map3 合成图
  26. Z3=max(Z1,Z2);
  27. figure(3);
  28. surf(Z3); %画出三维曲面
  29. shading flat; %各小曲面之间不要网格
  30. xlabel('X(单位:千米)')
  31. ylabel('Y(单位:千米)')
  32. zlabel('Z(单位:千米)')



复制代码

map

map
发表于 2011-5-8 20:52 | 显示全部楼层
帮你看了下,请你首先运行的你程序,将figure1-2关闭,并在command窗口中运行下面的代码:
  1. figure_info=findall(gcf,'type','surf');
  2. xx=get(figure_info,'xdata');
  3. yy=get(figure_info,'ydata');
  4. z=get(figure_info,'zdata');
  5. [n,m]=size(z);
  6. [x,y]=meshgrid(xx,yy);
  7. xyz=[reshape(x,n*m,1) reshape(y,n*m,1) reshape(z,n*m,1)];
复制代码
上面的程序就是相对应的三维图形的坐标。
我运行过了,没问题,有结果输出。不知道你是不是这个意思!

评分

1

查看全部评分

发表于 2011-5-8 21:13 | 显示全部楼层
回复 6 # meiyongyuandeze 的帖子

非常感谢!就是你说的意思,我就是要得到figure3的图形坐标。谢谢!
发表于 2011-5-8 23:12 | 显示全部楼层
回复 7 # sunminmin 的帖子

不客气,一起学习
发表于 2011-5-9 15:57 | 显示全部楼层
回复 8 # meiyongyuandeze 的帖子

运行createmap.m文件之后会生成三维图,关闭figure1,figure2,下一步在Command Window中键入:
  1. figure_info=findall(gcf,'type','surf');
  2. xx=get(figure_info,'xdata');
  3. yy=get(figure_info,'ydata');
  4. z=get(figure_info,'zdata');
  5. [n,m]=size(z);
  6. [x,y]=meshgrid(xx,yy);
  7. xyz=[reshape(x,n*m,1) reshape(y,n*m,1) reshape(z,n*m,1)];
  8. save map.txt xyz -ascii;
复制代码

就将figure3的三维图的坐标保存到map.txt中了,map.txt数据格式为每一行为一个坐标(x,y,z)
  1.0000000e+000  1.0000000e+000  2.0000000e+000
  1.0000000e+000  2.0000000e+000  2.4651125e+000
  1.0000000e+000  3.0000000e+000  2.4267769e+000
  1.0000000e+000  4.0000000e+000  2.6111429e+000

通过这些点的坐标(x,y,z)绘制出它表示的三维图,我在commond窗口中键入:

  1. %% 1 打开文件
  2. [filename,filepath]=uigetfile('*.txt','选择文件!!!!');
  3. file = [filepath filename];
  4. fid = fopen(file,'rt');
  5. if fid == -1
  6. error('文件打开错误。')
  7. end
  8. %% 2 提取
  9. mynumber = [];
  10. while 1
  11. nextline = fgetl(fid);
  12. if ~isstr(nextline), break, end
  13. disp(nextline);
  14. a=sscanf(nextline, '%f');
  15. mynumber=[mynumber;a]
  16. end
  17. numplot=mynumber(:);
  18. plot(numplot);
复制代码

在窗口显示很长一列数据,只得到一个二维图,并不是三维的,这是怎么回事?
txt3D.jpg

最好能在VC++下调用matlab引擎实现用map.txt绘制出它表示的图形,能同时了解matlab与vc++混合编程利用matlab引擎做演示用的效果。
期待您的答复,谢谢!
发表于 2011-5-9 18:38 | 显示全部楼层
回复 9 # sunminmin 的帖子

自己解决了,呵呵
  1. load map.txt;
  2. maxX=max(map(:,1)); minX=min(map(:,1));
  3. maxY=max(map(:,2)); minY=min(map(:,2));
  4. xline=linspace(minX,maxX,81);%设置步长为1
  5. yline=linspace(minY,maxY,81);%设置步长为1
  6. [X,Y]=meshgrid(xline,yline);
  7. Z=griddata(map(:,1),map(:,2),map(:,3),X,Y);
  8. surf(Y,X,Z);
  9. shading flat
  10. %xlabel('X(单位:千米)')
  11. %ylabel('Y(单位:千米)')
  12. zlabel('Z(单位:千米)')
复制代码

点评

这样得到的结果与原图的区别在于:图形要旋转一下。  发表于 2011-5-9 18:41
发表于 2011-5-9 18:51 | 显示全部楼层
回复 10 # sunminmin 的帖子

map.jpg        通过txt数据绘图结果.jpg
发表于 2012-3-3 10:35 | 显示全部楼层
好贴~正好也解决了我的问题~~
发表于 2012-3-26 12:51 | 显示全部楼层
好贴~正好也解决了我的问题~~

呵呵,学习了!!
发表于 2012-3-27 01:18 | 显示全部楼层
Ref: 两个现有的fig图画在一起比较 或抓取axes数据 http://forum.vibunion.com/thread-83833-1-1.html
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-11-16 02:51 , Processed in 0.092179 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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