声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 6805|回复: 12

[编程技巧] matlab读取.bmp文件显示图形?

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

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

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

x
用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文件:
  1. I=imread('dx.bmp'); %读入一幅图片
  2. %I=I(33:375,74:508,:); %须事先人工确定行标和列标

  3. %提取坐标框内部分
  4. I1=I(:,:,1); %提取红色灰度矩阵
  5. pixel_black=(I1==0);
  6. number_col=sum(pixel_black);
  7. number_row=sum(pixel_black');
  8. j1=find(number_col==max(number_col));
  9. number_col(j1)=-1;
  10. j2=find(number_col==max(number_col));

  11. i1=find(number_row==max(number_row));
  12. number_row(i1)=-1;
  13. i2=find(number_row==max(number_row));
  14. I=I(min(i1,i2):max(i1,i2),min(j1,j2):max(j1,j2),:);

  15. %提取各等高线上颜色灰度值
  16. II=I;
  17. II(II==255)=0;
  18. II(II>0)=255;
  19. BW=II(:,:,1)+II(:,:,2)+II(:,:,3);
  20. [row_id,col_id]=find(BW);
  21. up_row_id=min(row_id);
  22. up_col_id=col_id(round(mean(find(row_id==up_row_id))));
  23. left_col_id=min(col_id);
  24. left_row_id=row_id(round(mean(find(col_id==left_col_id))));
  25. pixel_BW=BW(up_row_id:left_row_id,up_col_id);
  26. row_id=find(pixel_BW)-1+up_row_id;
  27. yanse(:,1:3)=I(row_id,up_col_id,:);
  28. %yanse=[0 0 143;
  29. % 0 47 255
  30. % 0 223 255
  31. % 143 255 111
  32. % 255 207 0
  33. % 255 31 0
  34. % 127 0 0]; %须事先人工确定各等高线颜色灰度值,用到了getpts函数

  35. [m,n]=size(I(:,:,1));
  36. BW=zeros([m,n]);
  37. x_xishu=4/(n-1);
  38. y_xishu=4/(m-1);
  39. gao=[0.1:0.1:0.7];

  40. %提取各等高线上点的三维坐标
  41. xyz=[];
  42. for i=1:7
  43. BW1=BW;
  44. BW1(I(:,:,1)==yanse(i,1)&I(:,:,2)==yanse(i,2)&I(:,:,3)==yanse(i,3))=1;
  45. [y,x]=find(BW1);
  46. xyz=[xyz;1+(x-1)*x_xishu 1+(y-1)*y_xishu gao(i)*ones(size(x))];
  47. end
  48. xyz=xyz(1:3:end,:);
  49. 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];
  50. x=xyz(:,1);
  51. y=xyz(:,2);
  52. z=xyz(:,3);

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

  56. [n,m]=size(x1);

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


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


复制代码
怎样能读取任何.bmp文件显示图形,做到不需要每次读一个.bmp文件就要重新写一个代码?

dx.rar

7.96 KB, 下载次数: 3

dx.bmp 对应山峰图

map.rar

19.51 KB, 下载次数: 3

map.bmp 对应地形图

回复
分享到:

使用道具 举报

发表于 2011-5-8 17:44 | 显示全部楼层
 楼主| 发表于 2011-5-8 18:05 | 显示全部楼层
回复 2 # ChaChing 的帖子

谢谢!
  1. a = [1];
  2. b = [1];
  3. c = [1];
  4. plot3(a,b,c,'s')
复制代码

用上面的代码能生成一个点,得到用一个小方格表示的,怎样写才能做到用黑点表示该点?
dian.jpg
发表于 2011-5-8 18:16 | 显示全部楼层
回复 3 # sunminmin 的帖子

plot3(a,b,c,'k.','MarkerSize',12)
 楼主| 发表于 2011-5-8 18:22 | 显示全部楼层
回复 4 # ChaChing 的帖子

怎样用一条直线把两个点(1,2,3)(5,2,8)连起来?
发表于 2011-5-8 22:52 | 显示全部楼层
回复 5 # sunminmin 的帖子

我都已上高速公路跑了几百公里回工作地了, 楼主还在!?:@)
plot3([1,5],[2,2],[3,8])

line([1,5],[2,2],[3,8]); view(3)
发表于 2011-5-8 23:17 | 显示全部楼层
回复 6 # ChaChing 的帖子

几百公里去工作地,好辛苦!
发表于 2011-5-8 23:24 | 显示全部楼层
回复 1 # sunminmin 的帖子

clc; clear; I=imread('dx.bmp'); I2=imread('map.bmp');
whos看看两者维数的不同(421x561x3, 698x1280)!
发表于 2011-5-8 23:30 | 显示全部楼层
回复 7 # meiyongyuandeze 的帖子

工作地与老家较远些! 不过相较内地应该还好:@)
 楼主| 发表于 2011-5-8 23:34 | 显示全部楼层
回复 6 # ChaChing 的帖子

呵呵,:@)我是想实现下面这个用三维坐标(x,y,z)画折线的功能
  1. 1.        Engine *ep;
  2. 2.       
  3. 3.        if (!(ep = engOpen(NULL))) //打开Matlab引擎
  4. 4.       
  5. 5.        {
  6. 6.       
  7. 7.        MessageBox ("Can't start MATLAB engine", MB_OK);
  8. 8.       
  9. 9.        exit(-1);
  10. 10.        }
  11. 11.        mxArray *xx=mxCreateDoubleMatrix(1,6,mxREAL);
  12. 12.        mxArray *yy=mxCreateDoubleMatrix(1,6,mxREAL);
  13. 13.        mxArray *zz=mxCreateDoubleMatrix(1,6,mxREAL);
  14. 14.       
  15. 15.        double x[] ={0,1,2,3,4,5}, y[] = {0,1,4,9,16,25}, z[] = {1,2,3,4,5,6};
  16. 16.       
  17. 17.        engPutVariable(ep,"xx",xx);
  18. 18.        engPutVariable(ep,"yy",yy);
  19. 19.        engPutVariable(ep,"zz",zz);
  20. 20.       
  21. 21.        memcpy(mxGetPr(xx),x,6*sizeof(double));
  22. 22.        memcpy(mxGetPr(yy),y,6*sizeof(double));
  23. 23.        memcpy(mxGetPr(zz),z,6*sizeof(double));
  24. 24.       
  25. 25.        engEvalString(ep,"绘制6个三维点连成的线");???
  26. 26.        接下来用循环如何实现6点相连接???

复制代码
就是利用matlab引擎在三维空间将这些坐标(x,y,z)所表示的点用黑点表示出来,前后两个点之间用直线连接,(0,0,1)连接(1,1,2)连接(2,4,3)连接(3,9,4)连接(4,16,5)连接(5,25,6),形成一条折线。

点评

这个还没玩过!  发表于 2011-5-8 23:59
 楼主| 发表于 2011-5-9 00:20 | 显示全部楼层
回复 10 # sunminmin 的帖子

VC++与matlab混合编程利用matlab引擎做的想要实现在三维空间画折线的功能,上面的代码接下来该如何处理??
发表于 2011-5-11 20:51 | 显示全部楼层
plot3不行?
发表于 2011-5-11 21:09 | 显示全部楼层
一直很纳闷,楼主费劲周折在matlab中画出曲面后再求出曲面点,在用这些点画直线,好像程序都是在matlab中编写的!
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-4-30 01:25 , Processed in 0.092803 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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