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

今天,在处理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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wendy_ya

您的鼓励将是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值