【问题标题】:Arrays Of Image Data are Different Lengths? Python PIL图像数据数组的长度不同?蟒蛇皮尔
【发布时间】:2018-02-11 00:09:54
【问题描述】:

我有一个程序可以将图像分解为 1 和 0(如下所示)。我的问题是不同图像的数组长度不同(使用相同的网络摄像头拍摄且未压缩)。

代码如下:

from PIL import Image
def read(filename):
    image = Image.open(filename, 'r')

    basewidth = 300
    wpercent = (basewidth/float(image.size[0]))
    hsize = int((float(image.size[1])*float(wpercent)))
    image = image.resize((basewidth,hsize), Image.ANTIALIAS)

    width, height = image.size
    print(width)
    print(height)
    data = list(image.getdata())

    binData = []

    for i in data:
        for j in i:
            tempBin = str(bin(j))
            for k in tempBin:
                if k != "b":
                    binData.append(int(k))
    print(len(binData))
    return binData

我很困惑,因为我同时使用相同的网络摄像头、相同的分辨率拍摄了照片。它们的文件大小不同,但我不知道为什么。

感谢您提供的任何解决方案!

【问题讨论】:

    标签: python arrays python-3.x image python-imaging-library


    【解决方案1】:

    您没有向我们展示图像,但可能是因为压缩? JPG 文件是经过压缩的,许多其他文件格式也是如此。

    即使是两张相距不远的照片也有一点不同,压缩方式也不同,因此“分辨率相同,文件大小不同”。

    【讨论】:

    • 有道理;您可以提出解决方案吗?
    • 对原始照片有帮助吗?
    • 取决于“原始”是否表示无标题的无损 JPEG 或 RGB 值。检查生成的数组的大小。如果是(高*宽*3)那么数据很可能是RGB数据。
    【解决方案2】:

    PIL 可以将 JPEG 转换为 BMP。 JPEG 是压缩的(频域和量化的,所以即使它是无损的,两个图像也可以因为它们的内容而具有不同的大小)。 BMP 只是每个像素的 RGB(红、绿、蓝)值加上一个标题。对于具有相同高度和宽度的图像,.bmp 文件将具有相同的大小(标题加上高度 x 宽度 x 3 个通道)。不过 jpeg 文件会更小。

    当然,getdata() 无论如何都会返回像素值。

    如果将字节转换为二进制字符串,则需要使所有二进制字符串的长度相同,并且可能需要手动将前面的 0 添加到某些二进制字符串中。

    【讨论】:

    • 我把图片转成bmps了,还是有些偏差。
    • 相同的高度和宽度?文件大小是多少(以字节或位为单位)?
    • 是的,高度和宽度相同。我的程序中的文件大小为 1,284,116 和 1,267,967。
    • 等等,您的代码看起来像是将像素转换为字符串?然后将字符串中的每个字符附加到列表中?字符串大小不同的原因相同,尽管 1 和 10 都是整数,但 1 中只有一个字符,10 中只有两个字符。
    • 啊,bin() 是否预先添加零?也就是说,它是否为十进制值 1 返回“00000001”?还是只返回“1”?
    猜你喜欢
    • 2019-06-19
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 2022-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多