python中不同函数读取图片格式的区别

前言:关于uint8和float型数据

为了节省存储空间,图像一般存储在一种特殊的数据类型——uint8(8位无符号整数)中,以此方式存储的图像称作8位图像。
imread把灰度图像存入一个8位矩阵,当为RGB图像时,就存入8位RGB矩阵中。
因此,通过matlab以及各种python包(skimage,imageio)读入图像的数据类型都是uint8的,而在数据运算中,如果不转换成double格式,计算可能会产生溢出。
总之先记住一句话:uint8用来存储和显示(imshow),double用来运算。

一、skimage.io。

读取方法: skimage.io.imread('图片地址')
返回的格式是uint8格式的数组。

二、imageio

读取方法: imageio.imread('图片地址').

返回的格式是一个imageio.core.util.Image类,其里边的元素也是uint8格式的。

以上两种类型均可以通过skimage.img_as_float转换成float64格式的图片。

转换公式为: float=uint8/255 f l o a t = u i n t 8 / 255
元素转换前后对比: 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 typerange
uint80 to 255
uint160 to 65535
uint320 to 232
float-1 to 1 or 0 to 1
int8-128 to 127
int16-32768 to 32767
int32-231 to 231 - 1
  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值