目前我有以下问题:我得到一个图像数据数组(一个大向量)。我既不知道图像的大小,只知道大小的公式(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中找出这些数据的编码和大小?
-
要确定图像的大小,我认为没有更好的方法可以简单地通过反复试验。首先我们确定与表达式兼容的图像大小
(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 的第三维。 -
如果你可以通过重塑输入向量来可视化你的图像,这意味着它直接包含每个像素的值,我们不关心图像的编码(它已经被解码了)。实际上,假设jpeg将离散余弦变换(DCT)系数存储在.jpeg文件中,j2k存储小波变换系数等。这不是您想要进入的内容,方法是为每种格式使用适当的库。