Как определить прозрачный диапазон для цвета пикселя

То, что я пытаюсь сделать, это проверить, является ли пиксель синим или нет.

Например: синий цвет находится в RGB, определяемом как rgb (0,0,255). Типичные глубины цвета: 8 бит (256 цветов), 16 бит (около 65 тысяч), 24 бит (около 16 миллионов) и 32 бит (более 4 миллиардов разных цветов). Таким образом, есть явно более одного оттенка синего.

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

Мой код до сих пор:

BufferedImage image = ImageIO.read(file);

// Getting pixel color by position x and y
for (int i = 0; i < image.getWidth(); i++) {
    for (int j = 0; j < image.getHeight(); j++) {
        int clr = image.getRGB(i, j);

Примечание 1:

http://www.workwithcolor.com/cyan-blue-color-hue-range-01.htm

Проблема в том, что происходит между шагами цвета?

Пример будет замечательным.

Примечание 2:

Я только что нашел презентацию по интересующей теме:

http://cstwiki.wtb.tue.nl/images/06-opencv.pdf

На странице 13 мы можем увидеть определение красного. Но как вы можете определить другие цвета?

Ответы

Ответ 1

По-моему, самый простой способ - преобразовать формат цвета в HSV/HSB, а затем выбрать синий диапазон для Hue. Точный диапазон может быть проблемой, но в основном я использую от 165 (ниже зеленый) до 240 (выше фиолетовый/фиолетовый). Насыщенность и значение/Яркость управляют только оттенками, но имейте в виду, что насыщенность около 0 будет довольно серой с синеватым оттенком, а значение около 0 будет почти черным. Из-за этого вы можете также проверить, что Saturation будет > 10 и Value > 15, но, конечно, вы можете выбрать свои собственные значения в соответствии с вашими потребностями.

Пример кода (не проверен):

boolean isBlue(int rgb){
    Color color = new Color(rgb);
    float[] hsb = Color.RGBtoHSB(color.getRed(), color.getGreen(), color.getBlue(), null);
    // now [0] is hue, [1] saturation and [2] value/brightness
    // all values are between 0 and 1 so you must divide hue by 360 and others by 100
    if(hsb[0] > 165/360 && hsb[0] < 240/360 && hsb[1] > 0.1 && hsb[2] > 0.15)
        return true;
    return false;
}

Wiki о HSV

RGBtoHSB javadoc

Выбор цвета для проверки цветов в разных системах

Ответ 2

В цветовом пространстве RGB это непросто сделать. Во-первых, способ отображения цветов зависит от устройства, то есть то, что когда-либо значение RGB, которое вы выбираете для отображения, может выглядеть совсем по-другому на разных экранах. Но даже если это можно каким-то образом контролировать, цвета, которые были назначены конкретными именами на английском языке, не обязательно занимают тот же объем в цветовом кубе RGB, ни с точки зрения размера, ни формы. Из-за этого существует несколько цветовых моделей, которые пытаются аппроксимировать человеческое восприятие цветов.

Одним из претендентов на это является цветовое пространство CIELab. "Лаборатория" относится к тому, как цвета представлены в этой модели: через яркость L цвета, положение цвета на красной/пурпурной и зеленой оси (a) и его положение на желтой и синей оси (b). Однако, к сожалению, нет простых формул для преобразования значений RGB или CMYK и Lab *, поскольку цветовые модели RGB и CMYK зависят от устройства. Значения RGB или CMYK сначала должны быть преобразованы в определенное абсолютное цветовое пространство, такое как sRGB или Adobe RGB. Эта настройка будет зависящей от устройства, но полученные данные из преобразования будут независимы от устройства.

Ответ 3

Технически ниже должна быть реализация синих оттенков.

boolean isBlueShade(int r, int g, int b)
{
    return (r == g) && (r != b);
}

Мы можем утверждать, что CYAN также является синим. Но технически это не синий. Если ваше приложение требует, чтобы некоторые связанные цвета были синими, то реализация вышеупомянутого метода включает эту проверку диапазона.

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