Python图像读取与数据类型转换详解:uint8与float处理
本文详细解析Python中不同库读取图像时的数据类型差异,重点讲解uint8与float64之间的转换方法。通过对比skimage和imageio的读取结果,提供无损转换代码示例,帮助开发者避免数据溢出与图像失真问题。
前言:关于uint8和float型数据
为了节省存储空间,图像通常以uint8(8位无符号整数)这种特殊数据类型进行存储,这类图像被称为8位图像。
使用imread读取灰度图像时,数据会被存入8位矩阵;若为RGB图像,则存入8位RGB矩阵中。
因此,通过Matlab及各类Python包(如skimage、imageio)读入的图像数据类型均为uint8。在后续数据运算中,若不转换为double格式,计算过程可能会产生溢出错误。
总结而言,需牢记一条原则:uint8用于图像的存储和显示(如imshow),而double(或float)格式用于数值运算。
一、skimage.io
读取方法为:skimage.io.imread('图片地址')
该函数返回的格式为uint8格式的数组。
二、imageio
读取方法为:imageio.imread('图片地址')。
其返回格式为一个imageio.core.util.Image类,其中的元素同样保持uint8格式。
上述两种读取类型的数据,均可通过skimage.img_as_float函数转换为float64格式的图片。
具体的转换公式如下:
元素在转换前后的数值对比示例为:67(uint8)转换为0.2627(float64)。
在程序中进行相互转换的具体操作如下:
1)将uint8转换为float
若需转换为float64,只需调用skimage.img_as_float()函数即可实现。
如果需要转换为float32格式,则在float64的基础上追加.astype(np.float32)操作。
示例代码参考如下:
img = skimage.img_as_float(img)#从uint8转换成float364
img = skimage.img_as_float(img).astype(np.float32)#从uint8转换成float32
2)将float64转换回uint8
这是目前找到的既能达到目的又能避免图像失真的方法:需分别利用skimage包和numpy中的函数进行转换。若直接使用numpy函数进行转换,会导致图像出现失真现象。
img = skimage.img_as_float(img)#先转换成uint16的格式。
img = np.uint8(img)#再转换成uint8的格式。
总结:从上述转换过程中可以看出,在进行格式转换时,应优先使用图形处理包提供的格式转换函数,尽量避免直接使用numpy中的格式转换函数,否则可能引发各种数据问题。
附:不同数据类型的取值范围对比如下:
| Data type | range |
|---|---|
| uint8 | 0 to 255 |
| uint16 | 0 to 65535 |
| uint32 | 0 to 232 |
| float | -1 to 1 or 0 to 1 |
| int8 | -128 to 127 |
| int16 | -32768 to 32767 |
| int32 | -231 to 231 - 1 |
补充:Python处理图像转化为uint8格式
在Python图像处理过程中,遇到的RGB图像像素值通常处于0-255之间。为了更便捷地处理图像,通常需要将图像数值归一化到0-1之间。
这一处理过程即为将图像的uint8类型转变为float类型的过程,具体操作为:img.astype('uint8')/255。
float类型的取值范围通常为:-1到1或者0到1。

总结
到此这篇关于Python中不同函数读取图片格式区别的文章就介绍到这了,更多相关Python读取图片格式的区别内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













