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)
是那里没写对吗?
1
yuhangch 2022-12-05 14:40:48 +08:00
怎么得到的保存后的颜色,显示器的问题?
|
3
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]) 这样,您就可以正确保存图像,并且保存后的图像颜色也是正确的。 |
4
dlsflh 2022-12-05 14:46:10 +08:00 via Android 2
随便在别人帖子下玩 AI 的真恶心。
|
5
coderluan 2022-12-05 14:46:18 +08:00
默认的 imwrite 是有损压缩的,你得设一下 IMWRITE_PNG_XXX 的一个什么属性,自己搜下吧
|
6
usnake OP @novolunt RGB 和 BGR 的颜色区别很明显,一个是蓝色一个是红色,但是我这个保存出来的红色比我设定的红色偏暗,不是 BGR 的问题吧
|
8
usnake OP @coderluan 用了 9 质量 颜色也不对
cv2.imwrite(r"img.png",img,[int(cv2.IMWRITE_PNG_COMPRESSION),9]) |
9
sivacohan 2022-12-05 14:55:45 +08:00
cv2.imwrite(filename, data, [cv2.IMWRITE_PNG_COMPRESSION, 0])
0 是不压缩 具体看你的版本吧,这个问题我也遇到过,就是保持的时候压缩了。 |
10
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. |
12
AyaseEri 2022-12-05 15:23:32 +08:00
你的 PS 画布工作在什么色彩空间下呢,是否经过了色彩管理映射呢
|
14
wangtian2020 2022-12-05 15:31:03 +08:00
不写 python ,会不会是 alpha 透明度通道被忽略了
|
15
usnake OP ![Snipaste_2022-12-05_15-31-20.jpg]( http://tva1.sinaimg.cn/large/006vnj0bgy1h8syxbbg0tj30q10e6mz0.jpg)
看起来还是挺明显的吧 |
16
AyaseEri 2022-12-05 15:34:13 +08:00
@usnake 什么 RGB ,sRGB 还是 Display P3 ,还是直接读了你显示器设定的 ICC ?如果不太清楚可能你得换个软件取色,PS 自带色彩管理会对输入图像按显示器设定做色彩转换。
|
18
ysc3839 2022-12-05 15:39:06 +08:00
你是取文字的颜色吗?估计是文字渲染经过了一些处理导致的。因为渲染文字时不是简单地用你指定的颜色去填充,而是会根据形状边缘做一些处理,使得文字观感更好,处理后的颜色就不是原始颜色了。建议试试用指定颜色填充一块矩形区域,取色看看是否一致。
|
19
laqow 2022-12-05 15:53:07 +08:00
感觉是 bk_img 带了颜色方案或者是 CMYK 的,导进来以后就把后面的颜色带歪了。
另外感觉 cv2 自己的 imread 功能不完整,用 PIL 的 open ,save 来导入导出图片 |
20
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 ,其他三幅图的颜色都是对的,分毫不差 |
21
lookStupiToForce 2022-12-05 16:02:26 +08:00
代码换了,用下面的测试
''' from PIL import Image, ImageDraw, ImageFont import cv2 import numpy as np def test(): image = Image.new('RGB', (150, 150), (255, 255, 255)) draw = ImageDraw.Draw(image) font = ImageFont.truetype("calibri.ttf", size=25) draw_text = 'why use\n\nPython' draw.text((10, 10), draw_text, font=font, fill=(235, 84, 77)) 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)) cv2.imwrite(output_file_3, cv2.cvtColor(np.asarray(image), cv2.COLOR_RGB2BGR)) cv2.imwrite(output_file_4, np.asarray(image)[:, :, ::-1]) if __name__ == '__main__': test() ''' |
22
usnake OP @lookStupiToForce 感谢您的耐心解答,后来我试过了,我的代码和您给的代码都没问题,有问题的是 photoshop ,我用 Photoshop 习惯取色是 RGB235 ,84 ,77 ,但是用 snipaste 桌面取色是 RGB255 ,68 ,68 ,可能是色彩空间有问题。现在问题解决了
|