Как определить, ближе ли цвет к белому или черному? - PullRequest
16 голосов
/ 20 марта 2012

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

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

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

Ответы [ 4 ]

28 голосов
/ 20 марта 2012

Я бы сказал, что вы можете сначала преобразовать цвет в оттенки серого, а затем проверить, ближе ли он к черному или белому.

Сначала преобразуйте значение цвета RGB для вычисления яркости по следующей формуле

Y = 0.2126*R + 0.7152*G + 0.0722*B

Затем проверьте, ближе ли значение к 0 или к 255, и выберите черный или белый соответственно.

color c = Y < 128 ? black : white

Имейте в виду, что это работает хорошо, если цветовое пространство не сжато гаммой, в противном случае у вас будетЧтобы добавить шаг перед вычислением яркости, которая является гамма-расширением , вычислите Y, затем выполните гамма-сжатие , чтобы получить нелинейное значение яркости, которое затем можно использовать для определения,цвет ближе к черному или белому.

4 голосов
/ 20 марта 2012

Взгляните на YCbCr . Поскольку Java и большинство компьютеров обрабатывают цвета в формате RGB, вам потребуется выполнить некоторое преобразование из RGB в YCbCr. Есть много формул для преобразования RGB в YCbCr.

Как только вы получите значение YCbCr, вы можете проверить значение яркости (значение Y в YCbCr).

3 голосов
/ 20 марта 2012

Существует два возможных значения белого и черного:

  • Цветовой спектр видимого света
  • Тон кожи человека определяется расой, количеством загора и т. Д.

Первый вариант прост: переведите его в диапазон оттенков серого 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)приблизительно средняя точка в типичных условиях

2 голосов
/ 20 марта 2012
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...