2013-12-11 100 views
0

我試圖計算出一維數組的值,這裏是我的代碼:平均值

所以,當我點擊「檢測」,它應該通過我的形象開始閾值,從我開始= 0到圖像的高度和從j = 0到圖像寬度:

public void detektieren_Click(object sender, RoutedEventArgs e) 
    { 
     for (i = 0; i < bitmap.Height; i++) 
     { 
      for (j = 0; j < bitmap.Width; j++) 
      { 
       stride = bitmap.PixelWidth * (bitmap.Format.BitsPerPixel/8); 
       data = new byte[stride * bitmap.PixelHeight]; 
       bitmap.CopyPixels(data, stride, 0); 
       index = i * stride + 4 * j; 

現在訪問ARGB數據:

   byte A = data[index + 3]; 
       byte R = data[index + 2]; 
       byte G = data[index + 1]; 
       byte B = data[index]; 

閾值後,如果有任何的像素滿足條件R = 0 & G = 0 & B = 255:

   if (Convert.ToInt32(R) == 0 && Convert.ToInt32(G) == 0 && Convert.ToInt32(B) == 255) 
       { 

        // Create a writer and open the file: 
        StreamWriter Messdaten; 
        if (!File.Exists("C:/Users/.../Messdaten.csv")) 
        { 
         Messdaten = new StreamWriter("C:/Users/.../Messdaten.csv"); 
        } 
        else 
        { 
         Messdaten = File.AppendText("C:/Users/.../Messdaten.csv"); 
        } 

        // Write to the file: 
        Messdaten.WriteLine(j + ";" + i); 

        // Close the stream: 
        Messdaten.Close(); 

        for (y = 0; y < bitmap.Height; y++) 
        { 
          for (x = 0; x < bitmap.Width; x++) 
          { 
           double x_mw = 0; double y_mw = 0; 
           int[] x_array = new int[(int)bitmap.Width]; 
           int[] y_array = new int[(int)bitmap.Height]; 

           x_array[x] = j; 
           x_mw = x_array.Average(); 

           y_array[y] = i; 
           y_mw = y_array.Average(); 

           xy_coord.Content = (int) x_mw + ";" + (int) y_mw; 
          } 
        } 

       } 
      } 
     } 
    } 

一切完全在CSV文件,我可以檢測的像素(例如藍色,R = 0 G = 0 B = 255)。但我也想將每個像素的數據複製到數組中。但顯然它並沒有真正實現我想要的。它不計算藍色像素總和的平均值(=藍色像素散射的質心),而只是顯示x_mw = 0和y_mw = 0。我做錯了什麼?

+0

對我來說,在循環中重複執行此代碼是毫無意義的。 stride = bitmap.PixelWidth *(bitmap.Format.BitsPerPixel/8); data = new byte [stride * bitmap.PixelHeight]; bitmap.CopyPixels(data,stride,0); – Paparazzi

+1

在x的內部循環中重複創建x_array和y_array也沒有意義。 – Clemens

回答

0

我做了一些修改後,它的工作原理。所以這是代碼:

public void detektieren_Click(object sender, RoutedEventArgs e) 
    { 

     int x_sum = 0; int y_sum = 0; int x_count = 0; int y_count = 0; int x_mw; int y_mw; 
     int[] x_array = new int[(int)bitmap.Width]; 
     int[] y_array = new int[(int)bitmap.Height]; 
     int[] x_array_copy = new int[(int)bitmap.Width]; 
     int[] y_array_copy = new int[(int)bitmap.Height]; 

     stride = bitmap.PixelWidth * (bitmap.Format.BitsPerPixel/8); 
     data = new byte[stride * bitmap.PixelHeight]; 
     bitmap.CopyPixels(data, stride, 0); 

     for (i = 0; i < (int) bitmap.Height; i++) 
     { 
      for (j = 0; j < (int) bitmap.Width; j++) 
      { 
       index = i * stride + 4 * j; 

       byte A = data[index + 3]; 
       byte R = data[index + 2]; 
       byte G = data[index + 1]; 
       byte B = data[index]; 

       if (Convert.ToInt32(R) == 0 && Convert.ToInt32(G) == 0 && Convert.ToInt32(B) == 255) 
       { 
        x_array[j] = j; 
        x_count++; 
        x_array_copy[j] = x_array_copy[j] + j; 
        x_sum = (int) x_array_copy.Sum(); 
        x_mw = x_sum/x_count; 

        y_array[i] = i; 
        y_count++; 
        y_array_copy[i] = y_array_copy[i] + i; 
        y_sum = (int) y_array_copy.Sum(); 
        y_mw = y_sum/y_count; 

        xy_coord.Content = x_mw + ";" + y_mw; 

       } 
      } 
     } 
    }