识别图像编码并将其转换为python中的真实图像



目前我有以下问题:我得到一个图像数据数组(一个大向量)。我既不知道图像的大小,只知道大小的公式(2^n*2^m)也不知道图像的编码(jpeg、j2k、有损 12 位 jpeg 或类似)。我知道编码的一个数组如下所示:

[-1000,  -888,  -884,  -883,  -884,  -886,...-850,  -852,  -854,  -854]
在这里,我可以

简单地将其重塑为我想要的形式(在这种情况下,它是长度的平方根),然后将其转换为我可以查看的图像

pixel_values = numpy.asarray(pixel_values).reshape(512, 512)
pl2 = pylab.imshow(pixel_values, cmap=pylab.cm.bone

但是现在我有另一个数组:

[65534, 57344,     4,     0,     0,     0, 65534, 57344,  7652,     1, 20479, 20991, 10496,     0,...35286, 23076, 34407, 36383, 56252, 65370,   217]

在这里我不能使用平方根或类似的东西(我知道图像总是像(2^n*2^m),我不知道如何将这些数据转换为我可以查看的真实图像。我怎样才能在python中找出这些数据的编码和大小?

  1. 要确定图像的大小,我认为没有更好的方法可以简单地通过反复试验。首先我们确定与表达式兼容的图像大小 (2^n, 2^m)

    import numpy as np
    vect_len = len(pixel_values)
    min_size = 256 # e.g. minimal size acceptable for one of the dimensions
    npm = np.log2(vect_len)  # this is n+m
    if not npm % 1:
        # n+m is an integer
        for n in range(1, npm):
              p = npm - n
              if 2**n < min_size or 2**p < min_size:
                  continue
              print(n,p)
    # (256, 2048)
    # (512, 1024)
    # (1024, 512)
    # (2048, 256)
    

    然后,对于每个可能的图像大小,我们重塑pixel_values数组并绘制结果,直到它看起来正确。如果是彩色图像,RGB 通道也会有大小为 3 的第三维。

  2. 如果你可以通过重塑输入向量来可视化你的图像,这意味着它直接包含每个像素的值,我们不关心图像的编码(它已经被解码了)。实际上,假设jpeg将离散余弦变换(DCT)系数存储在.jpeg文件中,j2k存储小波变换系数等。这不是您想要进入的内容,方法是为每种格式使用适当的库。

最新更新