Можно использовать указать адаптивное преобразование при использовании метода Image.convert()
. Детали не приводятся, но «адаптивный» в этом контексте обычно означает установленные цвета, которые наилучшим образом представляют цвета на изображении.
После выполнения преобразования значение, возвращаемое Image.getpalette()
, представляет собой список цветов RGB. представляя каждый из цветов, которые адаптивный алгоритм выбрал для помещения в палитру. Судя по результатам, полученным с использованием моего тестового изображения, цвета в таблице упорядочены по популярности (но я не уверен и не задокументирован).
Профессиональные программы для редактирования изображений, такие как Adobe Photoshop®. При преобразовании в изображение с палитрой имеют несколько параметров, в том числе «выборочное», «равномерное» и «перцептивное». Я часто использую последний, потому что он принимает во внимание тот факт, что человеческий глаз не может обнаружить различия между всеми цветами в равной степени, он использует некоторые метри c для измерения "воспринимаемой цветовой разницы".
from PIL import Image
image_filename = "oranges2.jpg"
img = Image.open(image_filename).convert("P", palette=Image.ADAPTIVE)
palette = img.getpalette()
colors = [palette[i:i+3] # Split palette entries up into groups of 3.
for i in range(0, len(palette), 3)]
print(len(colors))
for color in colors:
print(color)
Пример вывода:
256
[250, 212, 69]
[253, 194, 17]
[252, 185, 22]
[254, 185, 1]
[255, 177, 10]
[255, 177, 2]
[255, 177, 0]
[254, 177, 2]
[240, 177, 35]
[255, 167, 10]
[255, 168, 4]
[255, 167, 2]
...
[115, 15, 1]
[98, 19, 1]
[98, 11, 1]
[86, 16, 2]
[75, 15, 2]
[83, 7, 1]
[72, 7, 1]
[58, 12, 3]
[56, 6, 1]
[59, 3, 1]
[48, 3, 1]
[36, 8, 3]
[36, 2, 1]
[20, 6, 3]
[18, 2, 1]
Вот файл изображения, который я использовал для тестирования: