1、uint 8:无符号的 8位(8bit)整型数据(unit 都是存储型)int :整型数据1、在 MATLAB中,数值一般都采用 double型(64 位)存储和运算.2、为了节省存储空间,MATLAB 为图像提供了特殊的数据类型 uint8(8 位无符号整数) ,以此方式存储的图像称为 8位型像。3、函数 image能够直接显示 8位图像,但 8位型数据和 double型数据在 image中意义不一样,4、对于索引图像,数据矩阵中的值指定该像素的颜色种类在色图矩阵中的行数。当数据矩阵中的值为 0时,表示用色图矩阵中第一行表示的颜色绘制;当数据矩阵中的值为 1时,表示用色图矩阵中的第二行表示的
2、颜色绘制该像素,数据与色图矩阵中的行数总是相差 1。所以,索引图像 double型和 uint8型在显示方法上没有什么不同,只是 8位数据矩阵的值和颜色种类之间有一个偏差 1。调用格式均为 image(x); colormap(map);5、对于灰度图像,uint8 表示范围0,255,double 型表示范围0,1。可见,double 型和 uint8型灰度图像不一样,二者转换格式为: I8=uint8 (round (I64*255); !double 转换成 uint 8I64=double (I8)/255; !uint 转换成 double反之,imread 根据文件中的图像种类作不
3、同的处理。当文件中的图像为灰度图像时,imread把图像存入一个 8位矩阵中,把色图矩阵转换为双精度矩阵,矩阵中每个元素值在0,1内;当为 RGB图像时,imread 把数据存入到一个 8位 RGB矩阵中。! MATLAB中读入图像的数据类型是 uint8,而在矩阵中使用的数据类型是 double因此I2=im2double(I1) :把图像数组 I1转换成 double精度类型;如果不转换,在对 uint8进行加减时会产生溢出图像数据类型转换函数默认情况下,matlab 将图象中的数据存储为 double型,即 64位浮点数;matlab 还支持无符号整型(uint8 和 uint16) ;
4、uint 型的优势在于节省空间,涉及运算时要转换成 double型。im2double():将图象数组转换成 double精度类型im2uint8():将图象数组转换成 unit8类型im2uint16():将图象数组转换成 unit16类型!默认情况下,matlab 将图像中的数据存储为 double型,即 64位浮点数;matlab 还支持无符号整型(uint8 和 uint16) ;uint 型的优势在于节省空间,涉及运算时要转换成 double型。但是,问题的真正的解释其实应该是这样的。首先是在数据类型转换时候 uint8和 im2uint8的区别,uint 的操作仅仅是将一个 dou
5、ble类型的小数点后面的部分去掉;但是 im2uint8是将输入中所有小于 0的数设置为 0,而将输入中所有大于 1的数值设置为255,再将所有其他值乘以 255。图像数据在进行计算前要转化为 double类型的,这样可以保证图像数据运算的精度。很多矩阵的很多矩阵数据也都是 double的,要想显示其,必须先转换为图像的标准数据格式。如果转换前的数据符合图像数据标准(比如如果是 double则要位于 01 之间,这个是由 Matlab中的规定) ,那么可以直接使用 im2uint8。如果转换前不满足这个分布规律,则使用 uint8,将其自动切割至 0255(超过 255的按 255)最好使用
6、mat2gray,这个函数可以把一个 double类的任意数组转换成取值范围在0,1之间的,将一个矩阵转化为灰度图像的数据格式(double)另外,可以用 isgray判断矩阵是否是一个图像数据矩阵。matlab中用 imshow()显示图像与图像矩阵的数据类型的关系在 matlab中,我们常使用 imshow()函数来显示图像,而此时的图像矩阵可能经过了某种运算。在 matlab中,为了保证精度,经过了运算的图像矩阵 I其数据类型会从 unit8型变成double型。如果直接运行 imshow(I),我们会发现显示的是一个白色的图像。这是因为imshow()显示图像时对 double型是认为
7、在 01范围内,即大于 1时都是显示为白色,而imshow显示 uint8型时是 0255范围。而经过运算的范围在 0-255之间的 double型数据就被不正常得显示为白色图像了。 那么如何解决这个问题呢?笔者曾经用 fix()函数把图像矩阵由实数形式转化成整数形式,但这样仍无法改变图像矩阵是 double型的事实。 通过搜索,找到两个解决方法: imshow(I/256); -将图像矩阵转化到 0-1之间 imshow(I,); -自动调整数据的范围以便于显示 (不明白原理!%lwb 添加内容:此处用了图像灰度拉伸方法,将图像最小的像素值变为 0,最大的为 255%) 从实验结果看两种方法
8、都解决了问题,但是从显示的图像看,第二种方法显示的图像明暗黑白对比的强烈些!不知什么原理! 此外还找到一些方法,还没有试过,记录如下: uint8和 im2uint8的区别 图像数据在计算前需要转换为 double,以保证精度; 很多矩阵数据也都是 double的,要想显示其,必须先转换为图像的标准数据格式. 如果转换前的数据符合图像数据标准(比如如果是 double则要位于 01 之间) ,那么可以直接使用 im2uint8 如果转换前的数据分布不合规律,则使用 uint8,将其自动切割至 0255(超过 255的按 255) 最好使用 mat2gray,将一个矩阵转化为灰度图像的数据格式(
9、double) 另外,可以用 isgray判断矩阵是否是一个图像数据矩阵 总之,im2uint8、im2double 要跟 uint8、double 区别开来。double 就是简单地把一个变量类型转换成 double类型,数值大小不变;比如 a=6 是个 unit8类型的话,double(a)的结果还是 6,不过现在这个 6是 double类型的。函数 im2double将输入转换成 double类型。如果输入是 uint8 unit16 或者是二值的logical类型,则函数 im2double 将其值归一化到 01 之间,当然就是 double类型的了。如果输入本身就是 double类型
10、,输出还是 double类型,并不进行归一化。 。!imhist(I)为图像,在灰度条上显示一个直方图。直方图中 bin的数目有图像的类型决定。如果 I是个灰度图像,imhist 将使用默认值 256个 bins。如果 I是一个二值图像,imhist 使用两bins。imhist(I, n)使用指定的 n个 bin来绘制直方图。n 同时也制定了颜色条的长度,如果是二值图像,n 只能赋值为 2。imhist(X, map)为索引文件显示直方图。这个直方图在 colormap图上显示像素值的分布。colormap 必须至少和 X最大索引一样长。counts,x = imhist(.)bin应该是直方图直方的个数,要把灰度归为几类,有几个直方形,就有几个 bin。这样,如果设定了 bins,那么其他颜色之类,应该以一种算法归于最近的 bin。