Как найти доминирующий цвет в изображениях с помощью Python? - PullRequest
0 голосов
/ 19 сентября 2018

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

Основная цель: каждое изображение имеет топ-2 доминирующих видимых цветов, как показано ниже, и мне нужно получить эти цвета.

Ожидаемый результат:

image1: сине-желтый оттенок

image2: сине-зеленый оттенок

код:

from PIL import Image

import numpy as np
import scipy
import scipy.misc
import scipy.cluster

NUM_CLUSTERS = 5

print('reading image')
im = Image.open("captcha_green.jpg")   # optional, to reduce time
ar = np.asarray(im)
shape = ar.shape
ar = ar.reshape(scipy.product(shape[:2]), shape[2]).astype(float)

print('find clus')
codes, dist = scipy.cluster.vq.kmeans(ar, NUM_CLUSTERS)
print ('cluster centres:\n', codes)

vecs, dist = scipy.cluster.vq.vq(ar, codes)         # assign codes
counts, bins = scipy.histogram(vecs, len(codes))    # count occurrences

index_max = scipy.argmax(counts)                    # find most frequent
peak = codes[index_max]
colour = ''.join(chr(int(c)) for c in peak).encode("utf-8").hex()
print ('most frequent is %s (#%s)' % (peak, colour))

Для этого изображения

enter image description here

Я получаю больше всего frequent is [ 1.84704063 1.59035213 252.29132127] (#0101c3bc) По этой ссылке https://www.w3schools.com/colors/colors_picker.asp?color=80ced6 Это обнаружение истинного синего цвета.

Для зеленого изображения: вместо зеленого оттените егообнаруживает светло-розовый

enter image description here

Обнаружен цвет: most frequent is [142.17271615 234.99711606 144.77187718] (#c28ec3aac290) это неверный прогноз

1 Ответ

0 голосов
/ 19 сентября 2018

Кажется, что в строке есть ошибка

colour = ''.join(chr(int(c)) for c in peak).encode("utf-8").hex()

Попробуйте добавить это

for i in peak:
    print(hex(int(i)))

Будет напечатано правильных шестнадцатеричных символов.

Попробуйтеследующая строка:

colour = ''.join([hex(int(c))[2:].zfill(2) for c in peak])

Не нужно chr, так как hex() возвращает искомую строку, вам просто нужно сбросить цифры 0x ставит в начале.

...