[英]Assign scalar value to 'RGB' of few dominant colors of an image using python
[英]How to extract dominant colors using palettes on RGB images?
我正在尝试构建一个可以从图像中提取主要 colors 的模块。 例如,我试图从这个标志图像中提取四个 colors:
getpalette
和getcolors
方法返回None
,如果我尝试在 RGB 模式下使用它们。 (我试过设置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
转换为RGB
,因此palette
和colors
参数被忽略。
下一个问题,这也阻止了正确转换为模式P
:您有一个带有 JPG 工件的 JPG 图像。 您的图像包含的 colors 比您预期的要多得多。 从Image.getcolors
的文档中:
maxcolors – colors 的最大数量。 如果超过此数字,则此方法返回 None。 默认限制为 256 colors。
增加maxcolors
(对于一些完整的 24 位 RGB 图像,不同 colors 的可能最大数量为 2 24 ),并检查四个最突出的 colors:
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 工件,您有大量黑色、蓝色和红色 colors。 它们都比第一个黄色更突出,例如,即使设置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
----------------------------------------
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.