Программное определение цветов

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

Поэтому мне нужно указать диапазоны RGB, которые будут возвращать, например, значение красного ... или синего ... и так далее. Сейчас у меня есть что-то подобное, но оно не включает все возможные варианты RGB.

КРАСНЫЙ

R = 255, G <= 102, B = 0

R = 255, G = 0, B <= 150

ОРАНЖЕВЫЙ И ЖЕЛТЫЙ

R = 255, G> = 108 & ‹= 252, B = 0

R = 240, G = 255, B = 0

и так далее...

Кто-нибудь знает, как взять ЛЮБОЕ значение RGB и определить, является ли оно значением красного, оранжевого, желтого, зеленого, синего, фиолетового, желто-коричневого, белого или черного?


person mapk    schedule 25.07.2014    source источник
comment
Остерегайтесь, границы не жесткие и быстрые. В частности, люди будут спорить о желтом и оранжевом.   -  person Mark Ransom    schedule 26.07.2014
comment
Похоже, вы хотите что-то вычислить hue. В Википедии есть достойная статья о hue, включающая различные формулы, которые могут вам помочь. См. оттенок   -  person    schedule 26.07.2014
comment
@MikeW оттенок - хорошее начало, но он не помогает при попытке классификации, например. загар.   -  person Mark Ransom    schedule 26.07.2014
comment
@MarkRansom - спасибо. Я в курсе расхождений во мнениях по цвету. Майк В. - Спасибо, я проверю эту ссылку. Пока что большинство ответов, которые я встречал, рекомендуют конвертировать в HSL, поэтому я займусь этим.   -  person mapk    schedule 26.07.2014
comment
@mapk, это хорошо, но помните также, что этот вопрос и любые ответы будут жить еще долго после того, как вы получите ответ, который ищете, и уйдете. Следующий человек, обнаруживший это через Google, может оказаться не таким мудрым.   -  person Mark Ransom    schedule 26.07.2014


Ответы (3)


Вычислить визуальное сходство цветов по значениям RGB сложно из-за того, как работает человеческое восприятие. Популярным методом является CIE 2000. Есть некоторые библиотеки, реализующие его, например python-colormath. Затем вы можете просто сравнить цветовое расстояние для каждого из ваших цветов (вы можете найти разумные значения RGB для общих названий цветов здесь) и выберите тот, у которого наименьшее расстояние.

person Falk Hüffner    schedule 26.07.2014

Я думаю, что эта классификация зависит от человека. Например, для многих моих друзей-мужчин (я среди них) есть только несколько цветов (красный, синий, зеленый, желтый), в то время как у многих моих подруг-девушек есть по крайней мере 20 слов для обозначения розового. Даже если мы игнорируем это и решаем придерживаться меньшего числа ценностей, мы часто ссоримся, если что-то красное или коричневое, или что-то пурпурное или розовое. Если люди не могут дать однозначный ответ, вы не сможете научить этому компьютер.

При этом ваша проблема на самом деле является алгоритмом кластеризации / классификации, и есть много алгоритмов для ее решения. Я бы порекомендовал использовать какую-либо нейронную сеть (например, backpropagation с 3 входными нейронами - для красного, зеленого и синего). Тем не менее, вам понадобится много примеров - например, укажите цвета и их классификацию (это синий цвет и т. Д.). Даже если вы решите использовать другой алгоритм, вам все равно потребуется предоставить обучающий набор - набор примеров, которые вы уже классифицировали, и чем больше примеров будет в этом наборе, тем лучше будет классификация.

person Ivaylo Strandjev    schedule 26.07.2014

Это сложно решить даже людям. Я бы просто увидел значение rgb как трехмерную цветовую комнату. Просто укажите несколько цветов (красный: 255, 0, 0, ...) и скажите, что все на евклидовом расстоянии x одного цвета.

расстояние (красный, цвет) = sqrt ((red.r - color.r) ^ 2 + (red.g - color.g) ^ 2 + (red.b - color.b) ^ 2)

Или просто измерьте все расстояния и получите самое короткое в цвете.

person Nicolas    schedule 26.07.2014