Matplotlib 将 jpg 读入 int8,将 png 读入归一化浮点数

Max*_*mus 7 python matplotlib

为什么 Matplotlib 将 .png 加载到 float32 中(从 0 到 1):

img = mpimg.imread('some.png')
print(img.dtype)
>>> float32
Run Code Online (Sandbox Code Playgroud)

和 .jpg 到 int8(从 0 到 255):

img = mpimg.imread('some.jpg')
print(img.dtype)
>>> int8
Run Code Online (Sandbox Code Playgroud)

为什么?是基于什么考虑实现的?

Imp*_*est 12

正如imread文档所述:

matplotlib 只能在本机读取 PNG,但是如果安装了 PIL,它将使用它来加载图像并返回一个数组(如果可能)[...]

所以对于png图像,matplotlib 有自己的代码来读取图像,而对于jpg它依赖于PIL.

import matplotlib.pyplot as plt

im = plt.imread("house.png")
print im.dtype               # float32

im = plt.imread("house.jpg")
print im.dtype               # uint8
Run Code Online (Sandbox Code Playgroud)

_png负责加载png图像的内部模块有两个功能,read_png_float和read_png_int. 虽然默认read_png_float使用,但您也可以手动使用read_png_int获取整数图像。

import matplotlib._png as png

im = png.read_png_float("house.png")
print im.dtype              # float32

im = png.read_png_int("house.png")
print im.dtype              # uint8
Run Code Online (Sandbox Code Playgroud)

最后,一致的行为,你可以使用PIL两个,png和jpg图像而不是依赖于matplotlib。

from PIL import Image
import numpy as np

im = np.asarray(Image.open("house.png"))
print im.dtype              # uint8

im = np.asarray(Image.open("house.jpg"))
print im.dtype              # uint8
Run Code Online (Sandbox Code Playgroud)