2013-12-11 3 views
0

Я пытаюсь вычислить значение одномерного массива, вот мой код:Среднего значения элементов массива

Так что, когда я нажимаю «Detect», он должен начать порог через мое изображение, начиная с I = 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); данные = новый байт [шаг * bitmap.PixelHeight]; bitmap.CopyPixels (данные, шаг, 0); – Paparazzi

+1

Также нет смысла повторять создание x_array и y_array во внутреннем цикле над x. – 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; 

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