最近在用tensorflow跑一点GANs的实验,但是图片生成的效果一直很烂,为此重新检查了无数次的代码,甚至各种改网络结构,发现都是在做无用功。直到今天才发现,是我用imshow函数展示生成图片时,图片的数据类型不对!!!导致了imshow不能正常显示图片!!!
本文简单介绍一下MATLAB中图像的数据类型
- 在MATLAB(matplotlib也是如此)中,数值一般都采用double型(64位)存储和运算。
- 为了节省存储空间,为图像提供了特殊的数据类型uint8(8位无符号整数),以此方式存储的图像称为8位型像。
- 对于图像数据,uint8表示范围[0,255],double型表示范围[0,1]。可见,double型和uint8型灰度图像不一样,二者转换格式为:
U=uint8 ('double'*255) --> double转换成uint 8
D=double ('uint8') / 255. --> uint转换成double
MATLAB中读入图像的数据类型是uint8,而在矩阵中使用的数据类型是double。因此进行图像数据的运算时,需要将其转换成double精度类型;如果不转换,在对uint8进行加减时会产生溢出。
几种图像数据格式转换函数:
- im2double():将图象数组转换成double精度类型
- im2uint8():将图象数组转换成unit8类型
- im2uint16():将图象数组转换成unit16类型
MATLAB中用imshow()显示图像与图像矩阵的数据类型的关系
在MATLAB中,我们常使用imshow()函数来显示图像,而此时的图像矩阵可能经过了某种运算,为了保证精度,经过了运算的图像矩阵其数据类型会从unit8型变成double型。如果直接运行imshow(),我们会发现显示的是一个白色的图像。这是因为imshow()显示图像时对double型默认为在0~1范围内,即大于1时都是显示为白色,而imshow显示uint8型时默认是0~255范围。而经过运算的范围在0-255之间的double型数据就被不正常得显示为白色图像了。
如何解决这个问题呢?
1.imshow(I/255); 将图像矩阵转化到0-1的double类型数据;
2.使用uint8转换数据格式,再使用imshow()显示。
我们刚才说了uint8()函数和im2uint8()函数都可以将double类型的数据转换为uint8格式,那么两者的区别是是什么?还是说两者的实现方式是一样的?
uint的操作仅仅是将一个double类型的小数点后面的部分去掉;但是im2uint8是将输入中所有小于0的数设置为0,而将输入中所有大于1的数值设置为255,再将所有其他值乘以255。