如何在Python 3.6中将字节(1D)数组转换为RGB数组(2D)? (NumPy还是SciPy?)

时间:2017-03-12 02:47:18

标签: python numpy scipy byte pixel

我一直在试验二进制文件和字节的概念。我坚持的一项任务是,当我以整数形式读取一个字节的文件时,我无法弄清楚如何将其转换为RGB元组形式?例如,当我使用np.fromfile时,我在基本10整数表示中以字节为单位读取文件。如果我用scipy.misc.imread读取文件,它会以rgb元组的形式读取文件。

如何从np.fromfile矢量表示的输出转到scipy.misc.imread的RGB像素表示?

import numpy as np
from scipy import misc

path = "./Data/image.jpg"

# Read image as bytes
A = np.fromfile(path, dtype=np.uint8, count=-1) 
A.shape
#(54021,)
A.min(), A.max()
# (0, 255)
A
# array([255, 216, 255, ..., 100, 255, 217], dtype=uint8)

# Read image as RGB tuples
B = misc.imread(path)
B.shape
(480, 480, 3)
B.min(), B.max()
# (0, 255)
B
# array([[[ 28,  27,  23],
#         [ 15,  14,  10],
#         [ 14,  13,   9],
#         ..., 
#         [ 31,  26,  20],
#         [ 29,  24,  20],
#         [ 33,  28,  24]],

这是我在下面使用的测试图像: https://i.stack.imgur.com/zHiNp.jpg

2 个答案:

答案 0 :(得分:0)

JPEG是压缩的图像格式,因此无法直接从文件内容中获取rgb位图。你必须首先通过解码器。 imread()调用在使用PIL提供的解码器加载文件时执行此操作。

如果您想要一个易于解析的更简单的图像文件格式,请查看此问题的答案:What is the simplest RGB image format?

答案 1 :(得分:0)

您只需相应地更改形状即可。实际步骤如下:

1)使用scipy的misc.imread()读取图像 2)使用步骤1中的图像阵列创建原始文件 3)现在,使用np.fromfile从原始文件中创建实际图像 4)从misc.imread

分配形状信息

代码示例:

import numpy as np
from scipy import misc

# Read image using `imread`
suza = misc.imread('suza.jpg') 
suza.shape
# (1005, 740, 3)

# create raw file
suza.tofile('suza.raw')

# image from raw file
suza_from_raw = np.fromfile('suza.raw', dtype=uint8)
suza_from_raw.shape
# (2231100, )

# Assign the same shape from `misc.imread`
suza_from_raw.shape = (1005, 740, 3)