matlab利用三列数据生成一个二维图像,前两个设为坐标x,y第三个数据表示图像颜色强度

数据如上图所示,三列 前两列表示坐标,第三列表示颜色强度
生成图如这个图这样。求高手解答下
坐标点是离散的,而且由坐标点生成的像素点与颜色必须与坐标点含量值一一对应

首先将三列数据放到三个列向量X,Y,Z中
X,Y就是第一、二列数据,是坐标,Z表示强度,用颜色表示

把这样的数据图表示成二维的图像有两种办法
第一种,把不规则的散点数据插值计算到规则的二维网格,再画图
XI=linspace(min(X),max(X),m); %根据需要将X划分为m分
YI=linspace(min(Y),max(Y),n); %根据需要将Y划分为n分
ZI=griddata(X,Y,Z,XI,YI.'); %最后ZI是个nxm的矩阵
imagesc(XI,YI,ZI);colorbar; %使用imagesc将矩阵画成图像
这种办法,由于数据是规则的网格,所以图像比较漂亮
而得到的二维规则矩阵,很容易保存成图像
但是数据是插值出来的,所以失去原来散点的信息

第二种,将散点数据用划分为平面内多个互相连接三角形,再画图
tri=delaunay(X,Y); %将散点划分为平面三角形网格
patch('Faces',tri,'Vertices',[X,Y],'FaceVertexCData',Z,...
'FaceColor','interp','EdgeColor','none');
colorbar;
这种办法得到的图像完全保留散点的信息
还可以将最后的边颜色设置为黑色'EdgeColor','k'
这是显示三角形网格的划分
在原来散点的位置,X,Y,Z都是一一对应的
所以坐标点生成的像素点与颜色与坐标点含量值肯定一一对应

而其它地方的颜色是由这些值插值而得
这样图像边缘可能不规则追问

可否解释一些patch('Faces',tri,'Vertices',[X,Y],'FaceVertexCData',Z,...
'FaceColor','interp','EdgeColor','none');
colorbar;

这句语句什么意思?

根据你的语句我得到了图像,但发现图像颜色差别不是很明显,我的Z数据大部分为3左右,只有少数值较大最大值为45

非常感谢

追答

patch就是给空间区域填充颜色
特别的可以用于三角网格表示的多个三角形的颜色填充

首先用
tri=delaunay(X,Y);
将撒播点数据X,Y划分为三角形网格
得到的tri是个nx3的矩阵,
n是划分三角形的个数
每一行三个数是十三个下标,表示三角形三个角分别是X,Y数据中的哪个
所以tri就相当记录了每个三角形的信息
而X,Y记录了这些三角形顶点的信息

其实得到tri后加上X,Y数据
我们很容易用tirplot(tri,X,Y)画出划分后的网格

加上Z数据,我们还可用

trimesh(tri,X,Y,Z)或trisurf(tri,X,Y,Z)画出三维的曲面图

现在你只需要画二维的图像,而Z用颜色表示,所以用patch比较合适

'Faces',tri,'Vertices',[X,Y] 就指定了三角网格的面和顶点
'FaceVertexCData',Z,'FaceColor','interp', 指定了顶点的颜色是根据Z数据确定,
而三角形面本身是没有数据的,所以用‘interp’就是插值来决定颜色
'EdgeColor','none'; 边指定三角形边的颜色,这里不要所以用‘none’

颜色对比不明显,是你的数据分布不均匀的结果
你可以在画完图之后,在菜单中选取Edit的Colormap选项
就会弹出一个Colormap Editor的对话框
拖动其中颜色条的标签位置就可以改变颜色
根据自己的需要调整到最好看就可以了

追问

真的太感谢你了,你的回答有知乎的感觉了。太专业了
我想颜色不均可否将生成的图片变大显示,就是让横纵坐标量度变小。把现在的 10的6次方和10的5次方变成10的5次方和10的4次方?

追答

坐标按比例缩小好像起不到什么作用吧
就像原来是0~10和0~10的图像,坐标轴的框也是0~10

而把坐标扩大成0~100和0~100的,坐标轴的框也相应的变成0~100
这样显示的结果并没有区别

追问

好的,我再试试。非常感谢

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-06-17
修改一下你的颜色映射试试。就是colormap函数。colormap函数是可以调整颜色映射的范围的,你可以查一下matlab中这个函数的用法。用一个help colormap就行啦。
相似回答