@maryaTurova

Как можно определить что цвет относится к синему (оттенки синего)?

Данным кодом я получаю доминирующий цвет на картинке.
Код
from __future__ import print_function
import binascii
import struct
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('image.png')
im = im.resize((150, 150))      # optional, to reduce time
ar = np.asarray(im)
shape = ar.shape
ar = ar.reshape(np.product(shape[:2]), shape[2]).astype(float)

print('finding clusters')
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 = np.histogram(vecs, len(codes))    # count occurrences

index_max = np.argmax(counts)                    # find most frequent
peak = codes[index_max]
colour = binascii.hexlify(bytearray(int(c) for c in peak)).decode('ascii')
print('most frequent is %s (#%s)' % (peak, colour))


Вывод:
62e16e3eddc0a858886705.png

Как мне определить является данный rgb,hex в оттенках синего (голубого)?
  • Вопрос задан
  • 109 просмотров
Пригласить эксперта
Ответы на вопрос 3
Vindicar
@Vindicar
RTFM!
Очевидно, нужно определить, что с твоей точки зрения "оттенок синего".
Например, "синяя составляющая должна быть максимальной, и должна не менее чем в два раза превышать большую из красной и зеленой составляющих". Но этот подход ограничен, так как RGB (а точнее BGR) модель не слишком удобна для таких манипуляций с цветом.

Для большего удобства переведи цвет в HSV. Тогда ты сможешь огранить цвет (H) некоторым диапазоном, задать минимально допустимую насыщенность (S, чем меньше - тем более серый цвет) и минимально допустимую яркость (V).
Ответ написан
Цвет перевести в модель HSV – например, модулем colorsys.

H определяет как раз оттенок. Установите опытным путём в Фотошопе, какой диапазон значений H можно отнести к «оттенкам синего (голубого)».

Вариации двух других параметров, S (насыщенность) и V (яркость) не влияют на «цвет» оттенка.
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
В базисе RGB тоже можно посчитать. Сначала выбирай центр кластера. Эталонный синий с которым хочешь сравнивать. Дальше для всех цветов считай просто декартово расстояние. И если допустим оно будет меньше какой-то величины- то близко к эталону. Вот неполный пример на другом языке. Можно как-то дописать на Python.

public double getDistance(int color1,int color2) {
        double rv = 0.299 * (getRPixel(color1) - getRPixel(color2));
        double gv = 0.587 * (getGPixel(color1) - getGPixel(color2));
        double bv = 0.114 * (getBPixel(color1) - getBPixel(color2));
        return sqrt(rv * rv + gv * gv + bv * bv);
}


Можно выбрать базис HSV, тогда для похожести брать измерение H (Hue) как эталон.
Но цветовой тон - вращается. Тоесть надо учитывать его как часовую стрелку например без 5 минут 12
близко к без 15 минут и к 12:05 одинаково.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы