matlab中image和colormap是什么关系?

像这个代码,image中的元素(0到255),对应于干gray(256)中的256个元素么??但如果使用的是colormap(gray),这样gray默认的只有64行,而不是256,行,matlab是怎么处理的
clear all
close all
x=linspace(-pi, pi, 100);
sf=6; % spatial freq in cycles per image
sinewave=sin(x*sf);

close all
onematrix=ones(size(sinewave));
sinewave2D=(onematrix'*sinewave);
scaled_sinewave2D=((sinewave2D+1)*127.5)+1;
image(scaled_sinewave2D)
% rescales numbers between -1 and 1 to lie between 1 and 256
colormap(gray(256))
axis equal
axis off

imshow和image: 图像的显示是最为重要的,用imshow和image都可以显示图像,但是有一定的区别。用的不对,就会象我最初一样,老是出错,或者得到一张空白图或者是彩色图显示成颗粒状、反相黑白图等等。image是用来显示附标图像,即显示的图像上有x,y坐标轴的显示,可以看到图像的像素大小。imshow只是显示图像。它们都可以用subplot来定位图像显示的位置,用colormap来定义图像显示用的颜色查找表,比如用colormap(pink),可以把黑白图像显示成带粉红色的图像,很有趣的。在这里最值得注意的是要显示的图像像素矩阵的数据类型。显示真彩色图像像素三维矩阵X,如果是uint8 类型,要求矩阵的数据范围为0-255,如果是double型,则其数据范围为0-1,要不就会出错或者出现空白页。类型转换很简单,如果你原来的数值是 uint8,在运算中转换为double后,实际要显示的数值没有改变的话,只要用uint8(X)就可转换为uint8型,如果不想转换频繁,也可在显示时用X/255来转换为符合0-1double类型范围要求的数值显示。如果显示索引图像(二维矩阵),因为不同数据类型对应颜色查找表colormap的基点不同,会有所区别,如果不对的话,会出现很多意外的显示效果的。如果索引图像像素数值是double型,则它的取值范围为1-length(colormap),数值起点为1,则矩阵中数值为1的对应colormap中第一行数据,如果索引图像像素数值是uint8,则取值范围为0-255,数值起点为0,则矩阵中数值为0的对应colormap中第一行数据,所以索引图像这两个数据类型之间的转换,要考虑到+1或-1。直接用uint8或double转换则会查找移位,产生失真情况。uint16数据类型与uint8类似,取值范围为0-65536
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-07-16

您好,我仔细阅读了帮助文档并进行实验,有如下结论,希望共同探讨:

    关于image函数:在您的程序中,scaled_sinewave2D是double类型二维矩阵,其取值在[1,256]之间,matlab会认为其是一个indexed图像,即像素取值对应于colormap中的颜色索引。因此其应当对应于一个256行的colormap。但在未显式指明colormap前,matlab的帮助文档中有个说法是colormap的行数与scaled_sinewave2D的行数一样,但实际测试表明默认colormap(也就是直接调用gray后返回的行数)是64行的,这点暂不清楚原因。但我认为可以忽略之,毕竟只有指定了正确的colormap才有意义,错误的情形可以不管它。

    关于gray函数:在没有参数时,gray会获取当前figure的colormap,并转换成行数相同的灰度map。在给出参数是就形成指定行数的灰度map。所以gray本身并没有”默认“一个什么行数。
本回答被提问者采纳
相似回答