为什么垂直与水平时图像尺寸不同?

pgi*_*lfc 3 python image image-processing python-imaging-library

尝试按照示例使用 PIL 创建随机图像:

import numpy
from PIL import image

a = numpy.random.rand(48,84)
img = Image.fromarray(a.astype('uint8')).convert('1')
print(len(img.tobytes()))
Run Code Online (Sandbox Code Playgroud)

这个特定的代码将输出 528。我们翻转 numpy 数组的数字:

a = numpy.random.rand(84,48)
Run Code Online (Sandbox Code Playgroud)

我们得到的输出是 504。这是为什么呢?

我期望字节数相同,因为 numpy 数组的大小相同。

Noa*_*gin 5

当您调用tobytes()布尔数组*时,数据可能按行进行编码。在第二个示例中,每行有 48 个布尔值img。所以每一行可以用6个字节(48位)来表示。6 字节 * 84 行 = 504 字节img。但是,在第一个示例中,每行有 84 个像素,不能被 8 整除。在这种情况下,编码器用 11 个字节(88 位)表示每行。每行有 4 个额外的填充位。所以现在总大小是 11 字节 * 48 行 = 528 字节。

如果你测试一堆随机输入形状对一个 2d 布尔数组进行编码,你会发现当每行的元素数量可以被 8 整除时,编码中的总字节数等于宽度 * 高度 / 8但是,当行长度不能被 8 整除时,编码将包含更多字节,因为它必须用 1 到 7 位填充每行。

总之,理想情况下,我们希望每个字节存储 8 个布尔值,但由于行长度并不总是能被 8 整除,并且编码器按row序列化数组,因此情况变得很复杂。

编辑以澄清:*PIL.Image模式“1”(二进制或“双层”图像)下的对象有效地表示布尔数组。在模式 1 中,对原始图像(在本例中为 numpy array a)进行阈值处理,将其转换为二值图像。