2011-01-20 10 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; 
      } 

는 편집 : 응답 모두에 대한

덕분에, 나는 비교에 많은 생각을 넣어,이 스레드를 만든 후 그것으로 문제를보고하지 않았다. 내 이미지는 회색조로되어있어 명암 대비가 높기 때문에 밝기 비교를 할 것입니다.

+1

자체 설명이 아닙니다. 픽셀의 RGB 값이 250,240,260이면 어떻게 될까요? 일치하거나해야합니까? –

+0

알베도 (밝기) 또는 색 균형과 같이 더 미세한 것을 단순히 측정하려고합니까? –

+0

"사이"는 색상이 다소 정의되지 않았습니다. 로우 랜드 (Rowland)가 말했듯이, 붉은 색과 보라색 사이에 푸른 색이 있는가? 마젠타는 ... 연두색과 자주 빛 사이에 있니? 코드 예제 대신에 달성하고자하는 단어를 입력 할 수 있습니까? –

답변

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

나는 당신이 당신의 특정 요구에 맞게 수정할 수 있다고 가정! 기본적으로 색조에 따라 색상을 비교 한 다음 채도로, 그리고 마지막으로 밝기로 색상을 비교합니다. (나는 이것을 색상 정렬을 위해 사용한다.)

관련 문제