我一直在试验二进制文件和字节的概念。我坚持的一项任务是,当我以整数形式读取一个字节的文件时,我无法弄清楚如何将其转换为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
答案 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)