您当前的位置: 首页 >  ui

wendy_ya

暂无认证

  • 1浏览

    0关注

    342博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

手写数字识别问题(4)——图像处理时常见问题之uint8与double类型详解

wendy_ya 发布时间:2020-04-10 11:44:41 ,浏览量:1

今天,在处理mnist数据集时,遇到一个十分棘手的问题,读取到test最后一张图像时,出现了一个很神奇的问题。 原始图像应该是这样的: 在这里插入图片描述 但是调用函数从’t10k-images.idx3-ubyte’读取出来却是这样的, 在这里插入图片描述 刚开始,我以为二值化阈值过大,但是,利用将原始图像灰度化得到后的图像如下图所示,与上图大相径庭。

n=graythresh(I);
I=im2bw(I,n);%利用灰度阈值二值化

在这里插入图片描述 经过多方查阅资料后才得知,是uint8与double没弄清楚。

matlab中读取图片后保存的数据是uint8类型(8位无符号整数,即1个字节),以此方式存储的图像称作8位图像,相比较matlab默认数据类型双精度浮点double(64位,8个字节)可以节省存储空间。图像矩阵运算时的数据类型是double类型。这么做一是为了保证精度,二是如不转换,在对uint8进行加减时会溢出。 本案例中,

A=imread('1.bmp');

读取灰度图像后,图像以uint8类型存在。 在这里插入图片描述 而从’train-images.idx3-ubyte’中读取出来的矩阵却是double型, 在这里插入图片描述 在这里插入图片描述 因此发生了错误。如果直接对double之间的数据矩阵I运行imshow(I),我们会发现有时候显示图像部分失真或完全失真。 这是因为imshow()显示图像时对double型是认为在0-1范围内,即大于1时都是显示为白色,而imshow显示uint8型时是0-255范围。所以对double类型的图像显示的时候,要归一化到0-1之间。 对double类型的图像显示的时候,除了归一化到0-1之间,也可以将double类型的0-255数据转为uint8类型。

将double型转换成uint8型即可。

d=uint8(c);
总结:

由于matlab读入图像的数据是uint8,而matlab中数值一般采用double型(64位)存储和运算。要运算时,所以要先将图像转为double格式的才能运算。

double(I)/255;   %uint转换成double

如果不转换,计算会产生溢出。

意思也就是显示的时候用uint8 ,运算的时候用double

im2uint8 和 uint8 :都是将图像数据转化为uint8 ,前者要求被转化的数据必须是符合图像数据标准(如:double [0 1]) ,而uint8则不必,它会自动截断数据。

im2double 和double : double就是将一个数据的类型转化为double ,但是数值不变; im2double将输入的uint8或uint16归一化到[0 1]区间 ,如果输入是double,则不做任何数值类型和数值大小的处理。

参考:https://blog.csdn.net/didi_ya/article/details/110246359

关注
打赏
1659256378
查看更多评论
立即登录/注册

微信扫码登录

0.0351s