2011-01-20 2 views
3

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

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

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

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:

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

+1

Это не так понятно - что, если ваш пиксель имел значение RGB 250,240,260? Должно ли это соответствовать или нет? –

+0

Вы просто пытаетесь измерить альбедо (яркость) или что-то более тонкое, как цветовой баланс? –

+0

«Между» довольно неопределенно для цветов. Как говорит Роуленд, «синий» между «красным и фиолетовым»? Как насчет пурпурного ... это между шартрезом и лиловым? Вместо примера кода вы можете выразить словами, что вы пытаетесь выполнить? –

ответ

2

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

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

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

Редактировать:

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

if (pixelColor.GetBrightness() <= 1.0f && pixelColor.GetBrightness() >= 166.0f/255.0f) 
1

Операторы сравнения не определены для 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; 
} 
2

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

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

Показаны статьи расчета светимость цвет своего или яркость:

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 значения, скорее всего, вызовет проблемы иначе.

+0

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

+0

@ Dan: Этот вопрос и мой ответ являются продолжением этого оригинального вопроса: http://stackoverflow.com/questions/4707607 И причина, по которой я думаю, что тестирование яркости может быть полезно. –

0

Вот мое решение сравнить цвета:

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; 
     } 
    } 
} 

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

Смежные вопросы