枕头模块 - 裁剪和保存时色调变化(无转换)
Pillow module - hue change when cropping and saving (no conversion)
我想裁剪图像并保存,但问题是图像在保存相同格式后色调变化很大。为什么会这样?我什至没有在这个过程中转换它。
这是我的代码:
def square_crop(resized_image):
print "square crop"
width, height = resized_image.size
print width,height
edge_length = 3600
if(width >= height):
print("width>=height")
left = (width - edge_length)/2
top = (height - edge_length)/2
right = (width + edge_length)/2
bottom = (height + edge_length)/2
squared_image = resized_image.crop((left, top, right, bottom))
squared_image.save('squared.png')
而且令人困惑的是,这段代码使用了相同的图像并在没有改变色调的情况下保存它,所以裁剪功能肯定有问题:
def image_resize(image):
print "image resize"
width, height = image.size
print width,height
if(width > 3601 and height > 3601):
print width, height
if(width >= height):
ratio = float(width)/float(height)
w = 3601 * ratio
h = 3601.0
print ratio, w, h
resized_image = image.resize([int(w), int(h)])
resized_image.save("resized.png")
else:
ratio = float(height)/float(width)
print(ratio)
w = 3601.0
h = 3601 * ratio
print ratio, w, h
resized_image = image.resize([int(w), int(h)])
resized_image.save("heic1509a_resized.png")
*编辑:当我导入 .jpg 文件并保存为 .jpg 时,这两个函数都有相同的色调问题。与 .tif 相同。
**编辑:我还注意到,对于某些图像,这种红色损失不会发生。我真的不知道发生了什么。我会留下前后截图自己看。
Before - After
***编辑:问题出在颜色 space 上,因为保存时颜色发生变化的图像是使用 ProPhoto RGB 颜色编码的 space(ROMM RGB(参考输出介质指标) ).
我正在使用 gimp2 将它们首先转换为 RGB 而不会丢失颜色,但我想找到一种从 python.
自动执行此操作的方法
我会 post 关于此问题的任何新更新。
问题是当我保存文件时,PIL 库自动将图像(ROMM-RGB)的颜色 space 切换为其他颜色 space(RGB 或 sRGB)并且基本上每种颜色都变了。
您只需保留图像的颜色 space 即可。如果你想转换成另一种颜色 space 你应该查找 OpenCV library.
我无法详细解释太多,因为我只是想打破僵局。这是解决此问题的代码:
resized_image.save('resized.jpg', #file name
format = 'JPEG', #format of the file
quality = 100, #compression quality
icc_profile = resized_image.info.get('icc_profile','')) #preserve the icc profile of the photo(this was the one that caused problems)
这里有一个 link 更深入的答案:
我想裁剪图像并保存,但问题是图像在保存相同格式后色调变化很大。为什么会这样?我什至没有在这个过程中转换它。
这是我的代码:
def square_crop(resized_image):
print "square crop"
width, height = resized_image.size
print width,height
edge_length = 3600
if(width >= height):
print("width>=height")
left = (width - edge_length)/2
top = (height - edge_length)/2
right = (width + edge_length)/2
bottom = (height + edge_length)/2
squared_image = resized_image.crop((left, top, right, bottom))
squared_image.save('squared.png')
而且令人困惑的是,这段代码使用了相同的图像并在没有改变色调的情况下保存它,所以裁剪功能肯定有问题:
def image_resize(image):
print "image resize"
width, height = image.size
print width,height
if(width > 3601 and height > 3601):
print width, height
if(width >= height):
ratio = float(width)/float(height)
w = 3601 * ratio
h = 3601.0
print ratio, w, h
resized_image = image.resize([int(w), int(h)])
resized_image.save("resized.png")
else:
ratio = float(height)/float(width)
print(ratio)
w = 3601.0
h = 3601 * ratio
print ratio, w, h
resized_image = image.resize([int(w), int(h)])
resized_image.save("heic1509a_resized.png")
*编辑:当我导入 .jpg 文件并保存为 .jpg 时,这两个函数都有相同的色调问题。与 .tif 相同。
**编辑:我还注意到,对于某些图像,这种红色损失不会发生。我真的不知道发生了什么。我会留下前后截图自己看。
Before - After
***编辑:问题出在颜色 space 上,因为保存时颜色发生变化的图像是使用 ProPhoto RGB 颜色编码的 space(ROMM RGB(参考输出介质指标) ).
我正在使用 gimp2 将它们首先转换为 RGB 而不会丢失颜色,但我想找到一种从 python.
自动执行此操作的方法我会 post 关于此问题的任何新更新。
问题是当我保存文件时,PIL 库自动将图像(ROMM-RGB)的颜色 space 切换为其他颜色 space(RGB 或 sRGB)并且基本上每种颜色都变了。
您只需保留图像的颜色 space 即可。如果你想转换成另一种颜色 space 你应该查找 OpenCV library.
我无法详细解释太多,因为我只是想打破僵局。这是解决此问题的代码:
resized_image.save('resized.jpg', #file name
format = 'JPEG', #format of the file
quality = 100, #compression quality
icc_profile = resized_image.info.get('icc_profile','')) #preserve the icc profile of the photo(this was the one that caused problems)
这里有一个 link 更深入的答案: