但是问题的真正的解释其实应該是这样的。首先是在数据类型转换时候uint8和im2uint8的区别uint的操作仅仅是将一个double类型的小数点后面的部分去掉;但是im2uint8是将输入中所有小于0的数设置为0,而将输入中所有大于1的数值设置为255再将所有其他值乘以255。
图像数据在进行计算前要转化为double类型的这样可以保证图像数据运算的精度。很多矩阵的很多矩阵数据也都是double的,要想显示其,必须先转换为图像的标准数据格式如果转换前的数据符合图像数据标准(比如如果昰double则要位于0~1之间,这个是由Matlab中的规定)那么可以直接使用im2uint8。
如果转换前不满足这个分布规律则使用uint8,将其自动切割至0~255(超过255的按255)最好使用mat2gray这个函数可以把一个double类的任意数组转换成取值范围在[0,1]之间的,将一个矩阵转化为灰度图像的数据格式(double)另外,可以用isgray判断矩阵是否是一个图像数据矩阵
若希望将0-65535的灰度级映射到0-255上则可采用以下的办法:
matlab为图像提供了特殊的数据类型uint8(8位无符號整数),以此方式存储的图像称作8位图像可以节省存储空间。
imread把灰度图像存入一个8位矩阵当为RGB图像时,就存入8位RGB矩阵中
matlab读入图像嘚数据是uint8,而matlab中数值一般采用double型(64位)存储和运算所以要先将图像转为double格式的才能运算,区别如下:
如果不转换计算会产生溢出。
经過计算后I2已经是double型。
如果现在想imshow显示图像结果就需要再转换成uint8格式。
如果矩阵复合数据图像标准(0~1之间)
我们在使用时可以分成两个體系
在用uint8时matlab默认图像为[0,255]即你在imshow和imwrite时,数据是[0255]范围是没有问题的。此时如果直接double转为uint8(数据类型转换数据大小不会改变,不是你嘚double转为uint8你的[0,1]直接就能转为[0255]),数据将集中在[01],也就是全部数据都在0或1你的图像就是全黑。
在用double时matlab默认图像为[0,1]即你在imshow和imwrite时,数据要是在[0255],那么大于1的全为1所以你的图像就是全白。
将一个16位(0~65535)的图像Image转换成8位(0~255)有几种方法: