读取图像的字节
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 图片,如下所示:
我从一个文件中读取了 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 图片,如下所示: