Определить цвет пикселей между диапазонами ARGB - PullRequest
3 голосов
/ 20 января 2011

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

В основном я пытаюсь сделать следующее, код не требует пояснений, я просто не могу найти пример того, что я пытаюсь реализовать.

Заранее спасибо

if (img.GetPixel(bottomRightc.X, y) <= Color.FromArgb(255, 255, 255, 255) 
    && 
    img.GetPixel(bottomRightc.X, y) >= Color.FromArgb(255, 166,166,166))
           {
               return false;
           }

EDIT:

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

Ответы [ 4 ]

2 голосов
/ 20 января 2011

Рассматривали ли вы работу в другом цветовом пространстве? С HSV / HSB вы можете просто сделать что-то вроде

if (pixelColor.V <= 255 && pixelColor.V >= 166)
{
    return false;
}

Предполагается, что минимальное-максимальное значение / яркость 0-255. И при условии, что вы пытаетесь выполнить сравнение яркости, что мне не совсем понятно.

Edit:

Для этого есть методы в System.Drawing.Color, а яркость находится в диапазоне от 0,0 до 1,0. Таким образом, вышесказанное станет примерно таким:

    if (pixelColor.GetBrightness() <= 1.0f && pixelColor.GetBrightness() >= 166.0f/255.0f)
2 голосов
/ 20 января 2011

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

Проверка светимости позволит вам сравнить относительную яркость / темноту двух цветов. Это может быть очень удобно для вашего алгоритма обнаружения номерного знака, так как номерной знак черно-белый.

Пример статьи для расчета яркости цвета или яркости:

private static int Brightness(Color c)
{
   return (int)Math.Sqrt(
      c.R * c.R * .241 + 
      c.G * c.G * .691 + 
      c.B * c.B * .068);
}

Попытка сравнить отдельные значения R, G и B, скорее всего, приведет к неприятностям в противном случае.

1 голос
/ 20 января 2011

Операторы сравнения не определены для System.Drawing.Color, поэтому вы должны реализовать свои собственные методы сравнения. Я предлагаю использовать метод расширения, например:

static class ColorExtensions
{
    public static bool Between(this Color c, Color a, Color b)
    {
        /* insert comparison logic here */
    }

    public static bool LessOrEqual(this Color a, Color b)
    {
        /* insert comparison logic here */
    }

    public static bool MoreOrEqual(this Color a, Color b)
    {
        /* insert comparison logic here */
    }
}

так что вы можете использовать

var color = img.GetPixel(bottomRightc.X, y);
if(color.LessOrEqual(Color.FromArgb(255, 255, 255, 255) &&
   color.MoreOrEqual(Color.FromArgb(255, 166, 166, 166)))
{
    return false;
}

или

if(img.GetPixel(bottomRightc.X, y).Between(
   Color.FromArgb(255, 166, 166, 166),
   Color.FromArgb(255, 255, 255, 255)))
{
    return false;
}
0 голосов
/ 21 января 2011

Вот мое решение для сравнения цветов:

public int Compare(Color x, Color y)
{
    if (x.ToArgb() == y.ToArgb())
        return 0;
    float hx, hy, sx, sy, bx, by;

    // get saturation values
    sx = x.GetSaturation();
    sy = y.GetSaturation();
    // get hue values
    hx = x.GetHue();
    hy = y.GetHue();
    // get brightness values
    bx = x.GetBrightness();
    by = y.GetBrightness();

    // determine order
    // 1 : hue
    if (hx < hy)
        return -1;
    else if (hx > hy)
        return 1;
    else
    {
        // 2 : saturation
        if (sx < sy)
            return -1;
        else if (sx > sy)
            return 1;
        else
        {
            // 3 : brightness
            if (bx < by)
                return -1;
            else if (bx > by)
                return 1;
            else
                return 0;
        }
    }
}

Полагаю, вы можете изменить его в соответствии со своими потребностями!В основном он сравнивает цвет по оттенку, затем по насыщенности и, наконец, по яркости!(Я использую это для сортировки цветов.)

...