使用PIL保存的复制图像与原始图像像素不同

4

我需要复制一张图片来进行操作,但是保存原始图片和打开复制的图片似乎在像素值上有所不同:

from PIL import Image

# Open original image
img = Image.open("mountain.jpg")
data = img.load()

# Display individual pixels
print("Pixel 1: {}".format(data[0,0]))
print("Pixel 2: {}".format(data[0,1]))
print("Pixel 3: {}".format(data[0,2]))

# Makes a copy of the input image and loads the copied image's pixel map
copyImage = img.copy()

copyImage.save('copy.jpg')
copyImage.close()

# Opens the copied image that was saved earlier and its pixel map
copy = Image.open("copy.jpg")
copy_data = copy.load()

print()

# Display copied images' individual pixels
print("Pixel 1 (copy): {}".format(copy_data[0,0]))
print("Pixel 2 (copy): {}".format(copy_data[0,1]))
print("Pixel 3 (copy): {}".format(copy_data[0,2]))

copy.close()

这将输出为:

Pixel 1: (72, 102, 112)
Pixel 2: (75, 105, 115)
Pixel 3: (71, 101, 111)

Pixel 1 (copy): (70, 100, 110)
Pixel 2 (copy): (77, 107, 117)
Pixel 3 (copy): (74, 104, 114)

一开始,我认为PIL可能会对R、G和B通道的每个像素值都进行2个值的更改(如前两个像素所示),但第三个像素对每个通道的更改为3个值。

我该如何创建一个可靠的图像副本,以便更改其像素,其中复制图像的起始像素与其原始像素相同?

注意: 除了我的'mountain.jpg'之外,我还尝试了其他图像,但似乎都会出现相同的问题。

2个回答

5

*.jpg 是一种 压缩图像格式。通过再次保存 jpg,您会使用不同的默认质量设置 jpg 编写器,因此导致生成的像素值不同。

请参见jpg 图像文件格式参数,了解可以传递给 image.save()quality 参数。

quality
图像质量,取值范围从1(最差)到95(最佳)。默认值为75。应避免使用高于95的值;100将禁用部分JPEG压缩算法,并导致文件过大,几乎没有提高图像质量。

两种方法:

相关:


第二点,从理论上讲,如何避免压缩? - Suraj Kothari
@Sur 你不需要避免压缩 - 如果你使用 shutil.copyfile 复制文件,你会得到一个与源文件完全相同的二进制副本 - 它将具有与原始文件相同的特性,除非你修改像素并再次保存它们 - 然后它会被重新压缩。你可以切换到 https://en.wikipedia.org/wiki/Image_file_formats#JPEG_2000 这是一种无损格式,如果多次加载/修改/保存,至少不会随着时间的推移而降低质量。 - Patrick Artner

2
问题是将图像保存为JPG格式。尝试使用PNG格式进行保存。 将图像保存为JPG会进行JPG压缩,这会改变像素。请执行以下操作:
copyImage.save('copy.png')
copyImage.close()

并且

copy = Image.open("copy.png")
copy_data = copy.load()

注意:

您可能想了解JPGPNG之间的区别。

JPG是有损压缩,会丢失数据。

PNG是无损压缩,不会丢失数据。

JPG将导致图像大小非常小,但每次保存图像时,您基本上都在进行再次压缩。总体质量较低。

PNG将导致相当大的大小,但保存和加载图像不会导致任何像素变化。


原始图像是JPG格式。但是将其保存为PNG格式会改变图像吗? - Suraj Kothari
@SurajKothari 不论原始图像的格式如何,一旦在Python中加载它,为了获得完全相同的副本,您需要将其保存为PNG格式,然后以PNG格式加载。 - Martin
相反地,如果您加载JPG图像并将其保存为JPG,则会更改图像。将JPG图像加载并保存为PNG将导致两个相同的图像(但两者的大小不同)。 - Martin
谢谢提供信息。我之前并没有意识到文件格式的重要性,直到我想起它们的真正作用。 - Suraj Kothari

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