Как определить, ближе ли цвет к белому или черному?
Я имею дело с изображениями и хотел бы определить, ближе ли набор пикселей к белому или черному.
Итак, учитывая набор цветов/пикселей, как определить, ближе ли они к белому или черному?
Я пробовал некоторые нубишские алгоритмы, кто-нибудь знает, как я могу это сделать?
Ответы
Ответ 1
Я бы сказал, что вы можете сначала преобразовать цвет в оттенок серого, а затем проверить, приближается ли он к черному или белым.
Сначала преобразуйте значение цвета RGB для вычисления яркости по следующей формуле:
Y = 0.2126*R + 0.7152*G + 0.0722*B
Затем проверьте, находится ли значение ближе к 0 или к 255 и выберите черный или белый соответственно.
color c = Y < 128 ? black : white
Помните, что это хорошо работает, если цветовое пространство не гамма сжато, иначе вам нужно будет добавить шаг перед вычислением яркости, которая является расширением гаммы, вычислить Y, а затем выполнить гамма-сжатие для получения нелинейной яркости значение, которое затем можно использовать, чтобы определить, ближе ли цвет к черному или белым.
Ответ 2
Взгляните на YCbCr. Поскольку Java и большинство компьютерных процессов окрашиваются в формат RGB, вам нужно будет сделать некоторое преобразование из RGB в YCbCr. Существует много формул для преобразования RGB в YCbCr.
Как только вы получите значение YCbCr, вы можете проверить значение яркости (значение Y в YCbCr).
Ответ 3
Есть два возможных значения белого и черного:
- Цветовой спектр видимого света
- Тоны кожи человека, определяемые расы, количества загар и т.д.
Первое легко: преобразовать в шкалу серого 0-255. 127 или меньше ближе к черному (0), 128 или выше ближе к белому (255).
Я использую следующую функцию для преобразования в оттенки серого с использованием значений яркости (в предположении формата int ARGB для цвета ввода):
public static int getLuminance(int argb) {
int lum= ( 77 * ((argb>>16)&255)
+ 150 * ((argb>>8)&255)
+ 29 * ((argb)&255))>>8;
return lum;
}
Последнее определение (человеческие тоны кожи) невозможно сделать с помощью простого алгоритма, поскольку оно зависит от условий освещения, настроек камеры, экспозиции и т.д. Значение RGB (190,115,60), вероятно, примерно соответствует средней точке в типичных условиях
Ответ 4