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

EDIT:回答のみんなのために

おかげで、私は比較に多くの考えを入れて、このスレッドを作成した後、それに伴う問題を見ていませんでした。私はイメージがグレースケール化されており、コントラストが高いので、明るさの比較をするつもりだと思う。

+1

これは自明ではありません。ピクセルのRGB値が250,240,260の場合はどうなりますか?一致するかどうか? –

+0

アルベド(明るさ)や色のバランスのような微妙なものを測定しようとしていますか? –

+0

"Between"は色については未定義です。ローランド氏の言うように、青色は赤色と紫色の間にありますか?マジェンタはいかがですか?コード例の代わりに、達成しようとしていることを言葉に入れることができますか? –

答えて

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

適切な比較のために、各色ごとに1つの値に派生させる必要があります。良い候補は明るさであり、うまくはcovered hereです。 (トピックのwiki articleは計算に少し異なる係数の組を使用しています)。

光度をテストすると、2色の相対明度/暗度を比較できます。このプレートは白黒であるため、ナンバープレートの検出アルゴリズムには非常に便利です。色の明るさ、または明るさを計算する

記事の例:

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

@ダン:この質問と私の答えは、このオリジナルの質問のフォローアップです: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; 
     } 
    } 
} 

私はあなたがあなたの特定のニーズに合わせて変更することができると仮定します!基本的には、色相で色を比較し、次に彩度で、最後に明るさで比較します。 (私は色をソートするためにこれを使用します。)

関連する問題