Подтвердить что ты не робот

Как определить, ближе ли цвет к белому или черному?

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

Итак, учитывая набор цветов/пикселей, как определить, ближе ли они к белому или черному?

Я пробовал некоторые нубишские алгоритмы, кто-нибудь знает, как я могу это сделать?

4b9b3361

Ответ 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), вероятно, примерно соответствует средней точке в типичных условиях