用枕头另存为JPEG的图像与原始图像不同。

时间:2018-08-23 18:18:00

标签: png python-imaging-library jpeg bmp

我有一个3-d numpy数组,并使用Pillow将其保存为JPEG图像。当我使用枕头重新加载图像时,所得的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 个答案:

答案 0 :(得分:2)

答案很简单...

JPEG “有损” 。它舍弃了最不明显的细节以节省空间-请参见Wikipedia entry for JPEG并向下滚动以查找“量化” 。甚至还没有从每个样本/通道数据的16位开始。

PNG BMP TIFF (除了JPEG编码的TIFF)是无损的-这意味着您可以完全取回保存的内容。

GIF 有点不同,因为它的调色板有限,因此您可能会从保存的图像中得到一些不同的信息,具体取决于原始图像的颜色。

如果每个样本/通道的数据为16位,则可能应使用 PNG NetPBM TIFF ,因为BMP无法存储每个样本数据16位-他们所说的24位意味着3个8位的通道。