Определение аналоговых (похожих) цветов - PullRequest
0 голосов
/ 14 февраля 2020

Я хочу сделать программу, которая берет цвет с изображения, а затем дает мне аналоговые цвета ..., но я не знаю, как я могу использовать цвет, взятый с изображения, потому что он не дает мне цвета, как объект ...

Я пытался сделать так:

from PIL import Image

img = Image.open("C:/Marco/programas/orange2.jpg").convert("P")

colors = []

for cor_rgb in img.getpalette():
    if cor_rgb not in colors:
        colors.append(cor_rgb)
c = Image.Image.getdata(img)

print(c)
print (colors)

Кто-нибудь может мне помочь, пожалуйста?

Ответы [ 2 ]

1 голос
/ 15 февраля 2020

Можно использовать указать адаптивное преобразование при использовании метода 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]

Вот файл изображения, который я использовал для тестирования:

enter image description here

0 голосов
/ 15 февраля 2020

Документация для getpalette показывает, что он выдает ее как плоский список [R,G,B, ... ]. Используя numpy.array, вы можете изменить его в массив [ [R,G,B], [...], ...] и получить уникальные элементы

from PIL import Image
import numpy

img = Image.open("image.jpg").convert("P")

colors = numpy.array(img.getpalette())
colors = colors.reshape((-1,3))
colors = numpy.unique(colors, axis=0)

print(colors)

Пример результата

[[  0   0   0]
 [  0   0  51]
 [  0   0 102]
 [  0   0 153]
 [  0   0 204]
 [  0   0 255]
 [  0  51   0]
 [  0  51  51]
 [  0  51 102]
 [  0  51 153]
 [  0  51 204]
 [  0  51 255]
 [  0 102   0]
 [  0 102  51]
 [  0 102 102]
 [  0 102 153]
 [  0 102 204]
 [  0 102 255]

Но я не знаю, как определить «аналоговые цвета»

...