读取图像的字节

Reading bytes for an image

我从一个文件中读取了 784 个字节(一张 28x28 的图像):

with open(self.filePath, 'rb') as f:
    aLetter = f.read(784)
    print ('A Letter',aLetter)
    image = Image.frombytes('1',[79,78],aLetter)

当我打印并将 'letter' 放入文本板时,我计算为 764 字节,而不是 784。但是当我将字母以 frombytes 的形式传递给枕头时,我可以将它传递到一个大小 [79,78]字节数组。

什么给了?我有多少字节?如何获取我的 784 字节数组来创建 28x28 字母图像? Pillow 如何看到比那里更多的字节?

对于那些感兴趣的人,数据来自这里: http://cis.jhu.edu/~sachin/digit/digit.html

其中解释:

Each training example is of size 28x28 pixels. The pixels are stored as unsigned chars (1 byte) and take values from 0 to 255

你没有 764 字节,因为如果你太短会抛出异常:

>>> Image.frombytes('1', [79, 78], bytes(764))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/mjpieters/Development/venvs/Whosebug-3.7/lib/python3.7/site-packages/PIL/Image.py", line 2331, in frombytes
    im.frombytes(data, decoder_name, args)
  File "/Users/mjpieters/Development/venvs/Whosebug-3.7/lib/python3.7/site-packages/PIL/Image.py", line 786, in frombytes
    raise ValueError("not enough image data")
ValueError: not enough image data

虽然您可以制作一个 too-large 784 字节的图像:

>>> Image.frombytes('1', [79, 78], bytes(784))
<PIL.Image.Image image mode=1 size=79x78 at 0x104D2ACF8>

PIL 接受的 79 x 78 图像的最小字节数是 780 字节。因为您创建的是 '1' 模式图像,每个字节中有 8 个像素,所以您只需要 math.ceil(79 / 8),即每行 10 个字节。

要查看 bytes 对象的长度,打印 len() 函数结果:

>>> with open('data0', 'rb') as f:
...     letter_data = f.read(28 * 28)
...     print(len(letter_data))
...
784

但是您对数据使用了错误的模式。 '1'开或关图片格式,只有0或1有意义。图像训练数据每个像素使用一个完整的字节或 256 个可能的值,因此您要使用 'L' 模式加载它:

letter_image = Image.frombytes('L', (28, 28), letter_data)

当使用'L'时,每个字节使用了完整的256个可能的值,你必须传入28 * 28个字节,否则如果你真的只有764个字节会出错:

>>> image = Image.frombytes('L', (28, 28), letter_data[:764])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/mjpieters/Development/venvs/Whosebug-3.7/lib/python3.7/site-packages/PIL/Image.py", line 2331, in frombytes
    im.frombytes(data, decoder_name, args)
  File "/Users/mjpieters/Development/venvs/Whosebug-3.7/lib/python3.7/site-packages/PIL/Image.py", line 786, in frombytes
    raise ValueError("not enough image data")
ValueError: not enough image data

使用 letter_image.save('/tmp/0.png')data0 中的第一张图片导出为 PNG 图片,如下所示: