python - 如何使用 RGB 图像上的调色板提取主色?
问题描述
我正在尝试构建一个可以从图像中提取主色的模块。例如,我试图从这个标志图像中提取四种颜色:
如果我尝试在 RGB 模式下使用 and 方法,则getpalette
返回getcolors
。None
(我试过设置maxcolors
,我仍然得到None
。)
paletted = img.convert('RGB', palette=Image.ADAPTIVE, colors=4)
print(paletted.getpalette())
print(paletted.getcolors(maxcolors=256))
# None
# None
如果我转换为P
模式,我可以使用这些模块,但我失去了黄色。
paletted = img.convert('P', palette=Image.ADAPTIVE, colors=4)
paletted.show()
我在这里做错了什么?
解决方案
首先,以下不起作用,或者准确地说,只是被忽略:
paletted = img.convert('RGB', palette=Image.ADAPTIVE, colors=4)
从文档中Image.convert
:
调色板- 从模式“RGB”转换为“P”时使用的调色板。可用的调色板是
WEB
或ADAPTIVE
。
您正在从RGB
to转换RGB
,因此palette
andcolors
参数被忽略。
下一个问题,这也阻止了正确转换为模式P
:您有一个带有 JPG 工件的 JPG 图像。您的图像包含的颜色比您预期的要多得多。从文档中Image.getcolors
:
maxcolors – 最大颜色数。如果超过此数字,则此方法返回 None。默认限制为 256 色。
增加maxcolors
(对于某些完整的 24 位 RGB 图像,不同颜色的最大可能数量为 2 24),并检查四种最突出的颜色:
from PIL import Image
img = Image.open('47ckF.jpg')
n_dom_colors = 4
dom_colors = sorted(img.getcolors(2 ** 24), reverse=True)[:n_dom_colors]
print(dom_colors)
# [(135779, (0, 0, 0)), (132476, (0, 0, 254)), (109155, (254, 0, 0)), (2892, (251, 2, 0))]
你会得到纯黑色、几乎纯蓝色、几乎纯红色和红色的变体。黄色在哪里?JPG神器!你有大量的黑色、蓝色和红色,它们都比第一个黄色更突出。例如,即使设置n_dom_colors = 20
也不会显示第一个黄色。
如何实现,您可能会想到什么?看看Image.quantize
,它将为您提供P
使用颜色量化的模式图像:
from PIL import Image
img = Image.open('47ckF.jpg')
img = img.quantize(colors=4, kmeans=4).convert('RGB')
n_dom_colors = 4
dom_colors = sorted(img.getcolors(2 ** 24), reverse=True)[:n_dom_colors]
print(dom_colors)
# [(139872, (1, 0, 1)), (138350, (0, 0, 253)), (134957, (252, 1, 1)), (3321, (253, 240, 12))]
你会得到几乎纯黑色、几乎纯蓝色、几乎纯红色和黄色变体!
作为参考,量化和重新转换的图像:
----------------------------------------
System information
----------------------------------------
Platform: Windows-10-10.0.16299-SP0
Python: 3.9.1
PyCharm: 2021.1.1
Pillow: 8.2.0
----------------------------------------
推荐阅读
- firebase - 使用未散列的密码批量用户导入到 Firebase
- xrandr - 在 VNC 中使用 xrandr 进行持久解析
- c# - 如何在 Moq 中短路属性设置器的调用
- html - 添加 index.html 以外的其他页面
- python - 如何将表导出到具有字段值作为文件名而不是部分的文件中
- c# - ASP Core HttpClientFactory 模式使用客户端证书
- php - 页面加载时的 Google reCAPTCHA 问题
- yahoo-finance - 如何从 URL 获取 Yahoo Finance 历史收盘价
- node.js - 错误:初始化会话后发送标头后无法设置标头
- sql - 连续对行的平均值