2011-06-21 85 views
2

だから私はそれにある特定の色のピクセル数を見つけることができるプログラムを作ろうとしています。画像はカメラで撮影した写真で、そのあといくつかの領域がPhotoshopでマークされています。このピクセルの正確な数を見つける必要があります。しかし、私はいくつかの問題があります。 私はgetPixel(x、y)を使用していますが、私はColor.FromArgb(赤、緑、青)と比較していますが、私の最初の問題は色が少し違っています RGB 116,110,40だが、この色をPhotoshopで描画すると、一部のピクセルはRGB 115,108,38(と他の同様のもの)のような少し異なる色になり、これも含めたい。だから私は最終的にこのコード(idは今動作しているようです)を思い付いた:画像の特定の色からピクセル数を見つける方法は?

public Form1() 
    { 
     InitializeComponent(); 
    } 

    Bitmap image1; 
    int count=0; 
    int red, green, blue; 
    int redt, greent, bluet; 
    double reshenie; 

    private void button1_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      red = int.Parse(textBox1.Text); 
      green = int.Parse(textBox2.Text); 
      blue = int.Parse(textBox3.Text); 

          // Retrieve the image. 
      image1 = new Bitmap(@"C:\bg-img.jpg", true); 
      double widht, height, pixel ; 
      int x, y; 
      MessageBox.Show(pixel.ToString()); 

      // Loop through the images pixels    
      for (x = 0; x < image1.Width; x++) 
      { 
       for (y = 0; y < image1.Height; y++) 
       { 
        Color pixelColor = image1.GetPixel(x, y); 
        redt = pixelColor.R; 
        greent = pixelColor.G; 
        bluet = pixelColor.B; 


        if ((red+10>=redt) && (red-10>=redt))//i used +-10 in attempt to resolve the problem that i have writed about the close colours 
        { 

         if ((green + 10 >= greent) && (green - 10 >= greent)) 
         { 
          if ((blue + 10 >= bluet) && (blue - 10 >= bluet)) 
          { 
           count += 1; 

          } 
         } 
        } 
       } 
      } 

      pictureBox1.Image = image1; 

      MessageBox.Show("Imashe " + count.ToString()); 
      count = 0; 

     } 
     catch (ArgumentException) 
     { 
      MessageBox.Show("There was an error." + 
       "Check the path to the image file."); 

     } 

    } 

問題は私が期待する結果を得るいけないということです。たとえば、1000ピクセルのようになったら、多かれ少なかれ、私のミスはどこにあるのかわかりません。だから誰かが私が間違ってやっていることを私に知らせることができれば。すべての助けを前もってありがとう。

+0

私のブログには、指定した色の画像の各ピクセルの位置を返すサンプルが掲載されています。 http://www.jarloo.com/find-all-pixels/ – Kelly

答えて

1

if ((green + 10 >= greent) && (green - 10 >= greent)) 

(a - 10 >= b)場合、(a + 10 >= b)確かに。理由を理解できるかどうかを確認してください。

私はあなたがgreentgreen - 10green + 10にする必要があり、また、物理的にの間にそれらの式に位置しているので、それは、読みやすさに役立ちますように条件を発注

if ((green - 10 <= greent) && (greent <= green + 10)) 

を意味しているかもしれないと思います。

+0

私はあなたの返信とあなたの声明を再読しました。*(a + 10> = b)なら、確かに(a - 10> = b)。あなたがなぜ*。が間違っているのか理解できるかどうかを見てください。例: 'a = 0、b = 5:0 + 10は> = 5、0 - 10は> = 5'ではないと思います:* '(a - 10> = b)'ならば確かに '( a + 10> = b) '*。 –

+0

正解、私は間違った方法でそれを持っていた。編集されました。 – skrebbel

5

代わりに、このループで試し:epsilonは各チャネルの画素色と標的された色との間の最大の差は、ある

int epsilon = 10; 

for (x = 0; x < image1.Width; ++x) 
{ 
    for (y = 0; y < image1.Height; ++y) 
    { 
     Color pixelColor = image1.GetPixel(x, y); 
     redt = pixelColor.R; 
     greent = pixelColor.G; 
     bluet = pixelColor.B; 

     if (Math.Abs(redt - red) <= epsilon && 
      Math.Abs(greent - green) <= epsilon && 
      Math.Abs(bluet - blue) <= epsilon) 
     { 
      ++ count; 
     } 
    } 
} 

。あなたのコードから

1

あなたの色の比較は正しくないと思います。 <=>=を混在させて、色の範囲内に収まるようにしようとしました。これを試してみてください:

if ((red+10 >= redt) && (red-10 <= redt)) //i used +-10 in attempt to resolve the problem that i have writed about the close colours 
{ 
    if ((green + 10 >= greent) && (green - 10 <= greent)) 
    { 
     if ((blue + 10 >= bluet) && (blue - 10 <= bluet)) 
     { 
      count += 1; 
     } 
    } 
} 
+0

ご協力いただきありがとうございます! 私は夢中になっていると思っていました...昨日働いていましたが、いくつかの変更が加えられてから停止しました... もう一度あなたの助けをありがとうございます!!! – Jordan

+0

素晴らしいことができました。答えの1つを選択し、それをあなたの受け入れられた解決策にしてください。 –

関連する問題