使用 Pillow 保存为 JPEG 的图像与原始图像不同。
The image saved as JPEG with Pillow is different from the original image.
我有一个 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 格式保存图像会出现这样的问题?
答案很简单...
JPEG 是 "lossy"。它会丢弃最不明显的细节以保存 space - 请参阅 Wikipedia entry for JPEG 并向下滚动以查找 "Quantisation"。它甚至没有开始使用每个 sample/channel 数据的 16 位。
PNG、BMP 和 TIFF(JPEG 编码的 TIFF 除外)是无损的- 这意味着您可以准确取回您保存的内容。
GIF 有点不同,因为它的调色板有限,因此您可能会取回与保存的内容不同的内容,具体取决于原始图像的颜色数量。
如果您的数据是 16 位的 sample/channel,您应该使用 PNG、NetPBM 或 TIFF 因为 BMP 无法存储每个样本数据的 16 位 - 他们所谓的 24 位意味着 3 个通道,每个 8 位。
我有一个 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 格式保存图像会出现这样的问题?
答案很简单...
JPEG 是 "lossy"。它会丢弃最不明显的细节以保存 space - 请参阅 Wikipedia entry for JPEG 并向下滚动以查找 "Quantisation"。它甚至没有开始使用每个 sample/channel 数据的 16 位。
PNG、BMP 和 TIFF(JPEG 编码的 TIFF 除外)是无损的- 这意味着您可以准确取回您保存的内容。
GIF 有点不同,因为它的调色板有限,因此您可能会取回与保存的内容不同的内容,具体取决于原始图像的颜色数量。
如果您的数据是 16 位的 sample/channel,您应该使用 PNG、NetPBM 或 TIFF 因为 BMP 无法存储每个样本数据的 16 位 - 他们所谓的 24 位意味着 3 个通道,每个 8 位。