繁体   English   中英

如何使用 RGB 图像上的调色板提取占主导地位的 colors?

[英]How to extract dominant colors using palettes on RGB images?

我正在尝试构建一个可以从图像中提取主要 colors 的模块。 例如,我试图从这个标志图像中提取四个 colors:

在此处输入图像描述

getpalettegetcolors方法返回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”时使用的调色板。 可用的调色板是WEBADAPTIVE

您正在从RGB转换为RGB ,因此palettecolors参数被忽略。

下一个问题,这也阻止了正确转换为模式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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM