使用Pillow保存为JPEG格式的图像与原始图像不同。

3
我有一个3维的numpy数组,并使用Pillow将其保存为JPEG图像。当我使用Pillow重新加载图像时,得到的numpy数组是不同的。 我写了一个演示代码:
from PIL import Image
import numpy as  np

file_extension = 'jpeg'
# generate a sample image 
image = range(1, 2*2*3+1)
image = np.uint8(np.array(image).reshape(2,2,3))
print 'image', image

img = Image.fromarray(image, "RGB")
img.save('test.'+file_extension)

# load image 
loaded_image = Image.open('test.'+file_extension)
loaded_image = np.array(loaded_image.convert('RGB'))
print 'loaded image', loaded_image

代码的输出如下所示:
image [[[ 1  2  3]
  [ 4  5  6]]

 [[ 7  8  9]
  [10 11 12]]]
loaded image [[[ 3  4  6]
  [ 3  4  6]]

 [[ 7  8 10]
  [ 8  9 11]]]

loaded_image与原始image不同。但是,如果我将file_extension更改为“ png”或“ bmp”等,则loaded_image将与原始image相同。

我想知道是否有人遇到过类似的问题,并知道为什么使用Pillow保存JPEG格式图像会出现这样的问题?

1个回答

3
答案非常简单... JPEG是一种“有损”压缩格式。它为了节省空间而丢弃最不明显的细节,可以查看JPEG的维基百科条目并向下滚动查找“量化”来了解更多信息。此外,它甚至不能处理每个样本/通道16位数据。 PNGBMPTIFF(除了经过JPEG编码的TIFF)为无损格式,这意味着你可以完全恢复你所保存的图像。 GIF有点不同,因为它具有有限的调色板,因此根据原始图像有多少颜色,可能会得到与所保存的不同的结果。
如果数据每个样本/通道是16位,则应该使用PNGNetPBMTIFF,因为BMP不能存储每个样本/通道16位数据——他们所说的24位指的是每种颜色通道8位。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接