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。
MATLAB figure的colormap中默认共有64种不同的颜色,所以colorbar的范围只能是[
1, 64](注意,不是[0, 63])。所以你矩阵中的数值范围也应该是[1, 64]。
比如
x=-5:1:5;
y=-5:1:5;
[xx,yy]=meshgrid(x,y);
zz=sqrt(xx.^2+yy.^2);
image(x,y,zz)
colormap(cool)
hold on
plot(x,y,'k+')
colorbar
结果只有蓝色,没有其他颜色,因为zz的数值在[0,7.13]之间
对于image函数,可以用三种方法:
1、使用imagesc函数,
2、使用image函数的'direct',但手动把zz的数值缩放到1~64
3、使用image函数的'scaled'
例如下面的程序
x=-5:1:5;
y=-5:1:5;
[xx,yy]=meshgrid(x,y);
zz=sqrt(xx.^2+yy.^2);
h=image(x,y,zz);
set(h,'CDataMapping','scaled')
colormap(cool)
hold on
plot(x,y,'k+')
colorbar
另外,gray(8),你会发现,此时colormap只有八个颜色,colorbar范围为[1~8].例如
x=-5:0.5:5;
y=-5:0.5:5;
[xx,yy]=meshgrid(x,y);
zz=sqrt(xx.^2+yy.^2);
image(x,y,zz)
colormap(gray(8))
hold on
plot(x,y,'k+')
colorbar
换为colormap(gray(8)),你会发现,此时colormap有108个颜色,colorbar范围为[1~108]
此时图像漆黑一片
事实上,灰度图和伪彩图是一回事。
灰度colormap不过是colormap的一种,其他colormap有多少种颜色,灰度colormap就有多少种颜色。只要在image中使用了colormap,那图上的不同颜色(灰度)不会超过64种
。
比如上面的程序
分别用colormap(gray(8))
colormap(gray(64))
和colormap(gray(89))
结果表明,前面两个差别很大。后面两个没有差别