为什么用 Python 保存的图片色彩不对呢

2022-12-05 14:34:21 +08:00
 usnake

draw.text((296,273),字符串,font=font,fill=(77,84,235)) 我这里用的颜色是 BGR(77,84,235)

cv2.imwrite(r"C:\Users\aaa\Desktop\img\img.png",img) 但是保存以后的颜色是 BGR(84,95,218)

是那里没写对吗?

2796 次点击
所在节点    Python
22 条回复
yuhangch
2022-12-05 14:40:48 +08:00
怎么得到的保存后的颜色,显示器的问题?
usnake
2022-12-05 14:43:23 +08:00
@yuhangch 保存的图片拉到 photoshop 里面用吸管取色的
novolunt
2022-12-05 14:43:36 +08:00
AI 的回答
这个问题可能是由于不同的图像处理库使用的颜色顺序不同导致的。在 Python 的 PIL 库中,颜色顺序通常为 RGB ,因此您在使用 PIL 库绘制文字时,颜色应该按照 RGB 的顺序指定。例如,在上面的代码中,您可以按照如下方式修改颜色顺序:

draw.text((296,273),字符串,font=font,fill=(235,84,77))

但是,在保存图像时,您使用的是 cv2 库,它使用的颜色顺序是 BGR 。因此,您需要将颜色顺序转换为 BGR ,才能正确保存图像。例如,您可以按照如下方式修改颜色顺序:

cv2.imwrite(r"C:\Users\aaa\Desktop\img\img.png",img[:,:,::-1])

这样,您就可以正确保存图像,并且保存后的图像颜色也是正确的。
dlsflh
2022-12-05 14:46:10 +08:00
随便在别人帖子下玩 AI 的真恶心。
coderluan
2022-12-05 14:46:18 +08:00
默认的 imwrite 是有损压缩的,你得设一下 IMWRITE_PNG_XXX 的一个什么属性,自己搜下吧
usnake
2022-12-05 14:46:58 +08:00
@novolunt RGB 和 BGR 的颜色区别很明显,一个是蓝色一个是红色,但是我这个保存出来的红色比我设定的红色偏暗,不是 BGR 的问题吧
coderluan
2022-12-05 14:47:59 +08:00
@novolunt AI 回答错误。PS:今天站长封了两个 AI 回复了。
usnake
2022-12-05 14:52:58 +08:00
@coderluan 用了 9 质量 颜色也不对
cv2.imwrite(r"img.png",img,[int(cv2.IMWRITE_PNG_COMPRESSION),9])
sivacohan
2022-12-05 14:55:45 +08:00
cv2.imwrite(filename, data, [cv2.IMWRITE_PNG_COMPRESSION, 0])
0 是不压缩

具体看你的版本吧,这个问题我也遇到过,就是保持的时候压缩了。
sivacohan
2022-12-05 14:57:14 +08:00
https://docs.opencv.org/4.x/d8/d6a/group__imgcodecs__flags.html#gga292d81be8d76901bff7988d18d2b42acad2548321c69ab9c0582fd51e75ace1d0


For PNG, it can be the compression level from 0 to 9. A higher value means a smaller size and longer compression time.
usnake
2022-12-05 15:00:48 +08:00
@sivacohan 用了 0 ,文件确实变大了 10 倍,但是颜色还是和我设定的有偏差
AyaseEri
2022-12-05 15:23:32 +08:00
你的 PS 画布工作在什么色彩空间下呢,是否经过了色彩管理映射呢
usnake
2022-12-05 15:29:54 +08:00
@AyaseEri RGB 呀
wangtian2020
2022-12-05 15:31:03 +08:00
不写 python ,会不会是 alpha 透明度通道被忽略了
usnake
2022-12-05 15:31:54 +08:00
![Snipaste_2022-12-05_15-31-20.jpg]( http://tva1.sinaimg.cn/large/006vnj0bgy1h8syxbbg0tj30q10e6mz0.jpg)
看起来还是挺明显的吧
AyaseEri
2022-12-05 15:34:13 +08:00
@usnake 什么 RGB ,sRGB 还是 Display P3 ,还是直接读了你显示器设定的 ICC ?如果不太清楚可能你得换个软件取色,PS 自带色彩管理会对输入图像按显示器设定做色彩转换。
usnake
2022-12-05 15:37:44 +08:00
@AyaseEri 不是,咱现在不保存文件,单纯用 python 的 cv2.imshow 窗口显示看起来颜色就不对呢
ysc3839
2022-12-05 15:39:06 +08:00
你是取文字的颜色吗?估计是文字渲染经过了一些处理导致的。因为渲染文字时不是简单地用你指定的颜色去填充,而是会根据形状边缘做一些处理,使得文字观感更好,处理后的颜色就不是原始颜色了。建议试试用指定颜色填充一块矩形区域,取色看看是否一致。
laqow
2022-12-05 15:53:07 +08:00
感觉是 bk_img 带了颜色方案或者是 CMYK 的,导进来以后就把后面的颜色带歪了。
另外感觉 cv2 自己的 imread 功能不完整,用 PIL 的 open ,save 来导入导出图片
lookStupiToForce
2022-12-05 16:01:13 +08:00
op ,你确定你代码的颜色给对了嘛?
另外建议直接 with Image.open('back.png') as image:...,不要用 bk_img = cv2.imread("back.png") 再 Image.fromarray(bk_img)转换一次,你这转换过去又转换回来极容易出错 /出现颜色转换损失
最后,经测试 3 楼用的 AI 回答也还是正确的

'''
from PIL import Image, ImageDraw, ImageFont
import cv2
import numpy as np

def test():
image = Image.new('RGB', (100, 100), (255, 255, 255))
draw = ImageDraw.Draw(image)
font = ImageFont.load_default()
draw_text = 'why use Python'
draw.text((10, 10), draw_text, font=font, fill=(235, 77, 84))

output_file = 'test.png'
output_file_2 = 'test_2.png'
output_file_3 = 'test_3.png'
output_file_4 = 'test_4.png'
image.save(output_file)
cv2.imwrite(output_file_2, np.asarray(image)) # op 原始方法
cv2.imwrite(output_file_3, cv2.cvtColor(np.asarray(image), cv2.COLOR_RGB2BGR)) # copliot 给的方法
cv2.imwrite(output_file_4, np.asarray(image)[:, :, ::-1]) # chatGPT 的方法


if __name__ == '__main__':
test()
'''
附图


反正除了 test_2.png ,其他三幅图的颜色都是对的,分毫不差

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/900227

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX