matlab中读取图片后保存的数据是uint8类型(8位无符号整数,即1个字节),以此方式存储的图像称作8位图像,相比较matlab默认数据类型双精度浮点double(64位,8个字节)可以节省存储空间。详细来说imread把灰度图像存入一个8位矩阵,当为RGB图像时,就存入8位RGB矩阵中。例如,彩色图像像素大小是400*300( 高 * 宽 ),则保存的数据矩阵为400*300*3,其中每个颜色通道值是处于0~255之间。虽然matlab中读入图像的数据类型是uint8,但图像矩阵运算时的数据类型是double类型。这么做一是为了保证精度,二是如不转换,在对uint8进行加减时会溢出。做矩阵运算时,uint8类型的数组间可以相互运算,结果仍是uint8类型的;uint8类型数组不能和double型数组作运算。
matlab读入图像的数据是uint8,将图像转为double格式:
(1.)im2double()函数:参数为unit8型数组时,转化结果矩阵元素取值位于(0,1)。但im2double()的参数是double型时,直接输出参数本身,不做任何数值类型和数值大小的处理。
(2.)double()函数:参数为unit8型数组时,转化结果矩阵元素取值位于(0,255)
matlab处理完图像矩阵后,用imshow()显示图像或用inwrite()写入图片。如果参数数据类型是double型,输出的图像部分区域会显示白色。因为imshow()显示图像时,认为double型数据位于(0,1),对于数组中大于1的元素,会将其归为1,显示为白色。inshow()显示图像时,对于图像数组为uint8型数据的情况,显示的范围是0~255。所以,对于0~255范围的double图像数组,要想正常显示,要么除以255进行归一化处理,要么将其转换成uint8型图像数组显示。
double型A,0~1色阶显示:
uint8型A,0~255色阶显示:
matlab默认的double类型图片数据是位于(0,1),uint8型图片数组是位于(0,255)。所以如果矩阵数据图像是double类型(0~1之间)可直接im2uint8,这样不仅完成数据类型转换,而且将0~1之间映射为了0~255之间的数据。但是如果图像矩阵数据是double类型的0~255,直接im2uint8转换的话,matlab会将大于1的数据都转换为255,0~1之间的数据才会映射到0~255之间整型的数据。
im2double(Img); %将图像数组Img转换成double精度类型
im2uint8(Img);等价于uint8(round(I*255)); %将图像数组Img转换成unit8类型
im2uint16(Img); %将图像数组Img转换成unit16类型
转载自原文链接, 如需删除请联系管理员。
原文链接:Matlab图像数据类型unit8,double关系,转载请注明来源!