有个matlab代码:将读入的图片转换成mnistuint8.mat,为什么要先double一下 g=im2mnistuint8.mat(mat2gray(double(f)));

[ZZ]MATLAB中uint8转换为double - 编著人 - 博客园
posts - 144, comments - 45, trackbacks - 0, articles - 12
MATLAB中读入图像的数据类型是uint8,而在矩阵中使用的数据类型是double
I2=im2double(I1) :把图像数组I1转换成double精度类型;如果不转换,在对uint8进行加减时会产生溢出
图像数据类型转换函数
默认情况下,matlab将图象中的数据存储为double型,即64位浮点数;matlab还支持无符号整型(uint8和uint16);uint型的优势在于节省空间,涉及运算时要转换成double型。
im2double():将图象数组转换成double精度类型im2uint8():将图象数组转换成unit8类型im2uint16():将图象数组转换成unit16类型IM2UINT8&&&DOUBLE
MatLab matlab编程中涉及到图象矩阵的数据类型uint8\double
这个问题是在刚开始接触使用Matlab处理图像时经常会遇见的困惑。
网上有这么一种说法:
默认情况下,matlab将图像中的数据存储为double型,即64位浮点数;matlab还支持无符号整型(uint8和uint16);uint型的优势在于节省空间,涉及运算时要转换成double型。
但是,问题的真正的解释其实应该是这样的。首先是在数据类型转换时候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判断矩阵是否是一个图像数据矩阵。
在MATLAB中,数值一般都采用double型(64位)存储和运算,为了节省存储空间,MATLAB为图像提供了特殊的数据类型uint8(8位无符号整数),以此方式存储的图像称为8位型像。函数image能够直接显示8位图像,但8位型数据和double型数据在image中意义不一样,对于索引图像,数据矩阵中的值指定该像素的颜色种类在色图矩阵中的行数。当数据矩阵中的值为0时,表示用色图矩阵中第一行表示的颜色绘制;当数据矩阵中的值为1时,表示用色图矩阵中的第二行表示的颜色绘制该像素,数据与色图矩阵中的行数总是相差1。所以,索引图像double型和uint8型在显示方法上没有什么不同,只是8位数据矩阵的值和颜色种类之间有一个偏差1。调用格式均为image(x);
colormap(map);对于灰度图像,uint8表示范围[0,255],double型表示范围[0,1]。可见,double型和uint8型灰度图像不一样,二者转换格式为:
I8=uint8 (round (I64*255));
I64=double (I8)/255;
反之,imread根据文件中的图像种类作不同的处理。当文件中的图像为灰度图像时,imread把图像存入一个8位矩阵中,把色图矩阵转换为双精度矩阵,矩阵中每个元素值在[0,1]内;当为RGB图像时,imread把数据存入到一个8位RGB矩阵中。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。图像处理(10)
1 有些函数支持double型,而不支持uint8的数据类型,所以要转换
2 精度问题了,因为uint8进行数据处理的时候,容易造成数据溢出或精度不够。
为了节省存储空间,matlab为图像提供了特殊的数据类型uint8(8位无符号整数),以此方式存储的图像称作8位图像。
imread把灰度图像存入一个8位矩阵,当为RGB图像时,就存入8位RGB矩阵中。
因此,matlab读入图像的数据是uint8,而matlab中数值一般采用double型(64位)存储和运算。所以要先将图像转为double格式的才能运算,
I2=im2double(I1) &%把图像I1转换成double精度类型 (假设图形矩阵范围0~255)
I64=double(I8); & %uint转换成double
如果不转换,计算会产生溢出。
经过计算后,I2已经是double型。如果现在想imshow显示图像结果,就需要再转换成uint8格式。如果矩阵复合数据图像标准(0~1之间),
I3=im2uint8(I2) &%把矩阵I2转换成uint8类型
如果超出0~1范围,就要用uint8()
I8=uint8(round(I64*255)); &%double转换成uint8 & &
或者mat2gray()
I3=mat2gray(I2) &&把矩阵转化为灰度图像格式double
最后可以知道,im2uint8,im2double和uint8,double是有区别的。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:39301次
积分:1571
积分:1571
排名:千里之外
原创:95篇
转载:186篇
(13)(37)(17)(21)(11)(6)(40)(18)(40)(31)(28)(2)(9)(7)  Matlab函数im2uint8简介
  函数名称: im2uint8
  函数功能: 把图像数据类型转换为无符号八位整型。如果输入图像是无符号八位整型的,返回的图像和
  源图像相同。如果源图像不是无符号八位整型的,该函数将返回和源图像相同但数据类型为uint8的图像
  (必要时对图像进行调整)。
  调用格式:
  I2 = im2uint8(I1)
  把灰度图像I1的数据类型转换成无符号八位整型的后, 返回。(但I1并不发生改变)
  RGB2 = im2uint8(RGB1)
  把真彩色图像的数据类型转换成无符号八位整型的, 并返回。注意这里并不是将真彩色图像转换成为黑白图像, 这里仅仅改变了图像数据的类型。
  I = im2uint8(BW)
  把二值图像BW的数据格式转换成uint8格式的, 由于二值图像的图像数据仅仅取0和1, 所以这里的转换效果仅仅是把1映射成255。
  X2 = im2uint8(X1,'indexed')
  相关函数: 、
  程序示例
  % this is a m file.
  imgdat = ('flower.jpg');
  uint8img = im2uint8(imgdat);
  (uint8img);
  上述程序把一张真彩色图像的数据类型转换成uint8格式, 但是显示出来的还是一副彩色图像。
&|&相关影像
互动百科的词条(含所附图片)系由网友上传,如果涉嫌侵权,请与客服联系,我们将按照法律之相关规定及时进行处理。未经许可,禁止商业网站等复制、抓取本站内容;合理使用者,请注明来源于。
登录后使用互动百科的服务,将会得到个性化的提示和帮助,还有机会和专业认证智愿者沟通。
此词条还可添加&
编辑次数:3次
参与编辑人数:3位
最近更新时间: 03:10:00
贡献光荣榜}

我要回帖

更多关于 mnistuint8.mat 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信