存储为 JPEG 格式且带枕头的图像与原始图像不同



我有一个 3-d numpy 数组,并使用枕头将其保存为 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 格式保存图像会带来这样的问题?

答案很简单...

JPEG"有损的"。它丢弃了最不明显的细节以节省空间 - 请参阅维基百科条目的JPEG并向下滚动查找"量化"。它甚至没有开始使用每个样本/通道 16 位的数据。

PNG,BMPTIFF(JPEG编码的TIFF除外(是无损的 - 这意味着您可以准确取回保存的内容。

GIF有点不同,因为它的调色板有限,因此您可能会根据原始图像的颜色数量获得与保存的内容不同的内容。

如果你的数据是每个样本/通道 16 位,你可能应该使用PNGNetPBMTIFF,因为 BMP 不能存储每个样本 16 位的数据——他们所说的 24 位意味着 3 个通道,每个通道 8 位。

相关内容

  • 没有找到相关文章

最新更新