**
matlab编程:为什么要对图像使用double函数,以及使用double函数之后imshow显示图像为什么只有一张白色图片?
**
一、matlab中读取图片之后,为什么要转换为double类型?
matlab中读取图片后保存的数据是uint8类型,但图像矩阵运算时的数据类型是double类型。这么做一是为了保证精度,二是如果不转换,在对uint8进行加减时会溢出。做矩阵运算时,uint8类型的数组间可以相互运算,结果仍是uint8类型的;uint8类型数组不能和double型数组作运算。
转换为double类型的两个函数:
①im2double()函数:参数为unit8型数组时,转化结果矩阵元素取值位于[0,1]。
如果im2double()的参数是double型时,直接输出参数本身,不做任何数值类型和数值大小的处理。
②double()函数:参数为unit8型数组时,转化结果矩阵元素取值位于(0,255)。
图1:原256*256图像部分数据,uint8类型
图2:用im2double函数处理之后的double图像部分数据
图3:用double函数处理之后的double图像部分数据
二、图片转换为double类型之后,用imshow显示为什么是一张白色图像?
这种情况,应该是用double函数处理后,再使用imshow函数显示造成的错误结果。
matlab默认的double类型图片数据是位于(0,1),uint8型图片数组是位于(0,255)。imshow()显示图像时,①对于double型数据,认为其范围是[0,1],对于数组中大于1的元素,会将其归为1,显示为白色。②对于uint8型数据的情况,显示的范围是0-255。所以,对于0~255范围的double图像数组,要想正常显示,要么除以255进行归一化处理,要么将其转换成uint8型图像数组显示。
转换为uint8的两个函数:
①im2uint8():要求像素值必须在0-1范围内:
如果矩阵数据图像是double类型(0-1之间)可直接im2uint8,这样不仅完成数据类型转换,而且将0-1之间映射为了0-255之间的数据。如果图像矩阵数据是double类型的0-255,直接im2uint8转换的话,matlab会将大于1的数据都转换为255,0-1之间的数据才会映射到0~255之间整型的数据,这个时候需要使用uint8函数。
②uint8():像素值可以是0-255。
图4:范围为0-255double图像用im2uint8函数转化结果(错误)
图5:范围为0-255double图像用uint8函数转化结果(正确)