imread() 返回的图像类型是uint8类型, 这时用imshow显示图像的时候, imshow会认为输入矩阵的范围在0-255, 如果imshow的参数为double类型的,那么imshow认为输入矩阵的值为0-1.
很多时候需要将图像转换为double类型的, 但是转换以后直接使用imshow显示的是一片白色, 是因为当imshow显示图像的时候, 会认为double类型的图像矩阵的范围在0-1, 超过1的像素值当作1处理, 这样就是几乎所有的像素都是白色。
通过搜索,找到两个解决方法:
imshow(I/256); -----------将图像矩阵转化到0-1之间
imshow(I,[]); -----------自动调整数据的范围以便于显示 (不明白原理!)
从实验结果看两种方法都解决了问题,但是从显示的图像看,第二种方法显示的图像明暗黑白对比的强烈些!不知什么原理!
此外还找到一些方法,还没有试过,记录如下:
uint8和im2uint8的区别
图像数据在计算前需要转换为double,以保证精度;
很多矩阵数据也都是double的,要想显示,必须先转换为图像的标准数据格式。
如果转换前的数据符合图像数据标准(比如如果是double则要位于0~1之间),那么可以直接使用im2uint8;如果转换前的数据分布不合规律,则使用uint8,将其自动切割至0~255(超过255的按255)
最好使用mat2gray,将一个矩阵转化为灰度图像的数据格式(double)
另外,可以用isgray判断矩阵是否是一个图像数据矩阵。