我需要对图像进行复制以进行操作,但是保存原始图像并打开复制的图像似乎在像素值方面有所不同:
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”以外的其他图像,但似乎都引起了相同的问题。
答案 0 :(得分:2)
问题是将图像另存为 JPG 。尝试使用 PNG 来实现。 通过将图像另存为JPG,您正在执行JPG压缩。这会改变像素。做
copyImage.save('copy.png')
copyImage.close()
和
copy = Image.open("copy.png")
copy_data = copy.load()
注意:
您可能希望查看 JPG 和 PNG 之间的区别。
JPG 是具有丢失数据成本的压缩
PNG 是压缩而不会丢失数据
JPG将导致图像尺寸非常小,但是每次保存图像时,基本上都是一次又一次地对其进行压缩。质量一般较低
PNG会导致很大的尺寸,但是保存和加载图像不会导致任何像素变化。
答案 1 :(得分:1)
*.jpg
是compressed image format。通过再次保存jpg
,您可以为jpg书写器使用不同的默认质量
因此产生的像素值会有所不同。
请参见image file format params for jpg,以获取可以传递给image.save()的quality
参数
质量
图像质量,范围从1(最差)到95(最佳)。 默认值为75。应避免使用大于95的值。 100会禁用JPEG压缩算法的某些部分,从而导致大型文件的图像质量几乎没有任何提高。
要么
png
f.e.)或相关: