2016-12-26 5 views
0

Hier versuche ich die Varianz eines Bildes zu berechnen, beginnend mit der Varince jeder Farbe in diesem Bild (ich habe die Varianz der roten Farbe berechnet, aber das Ergebnis ist - 1)Negativer Wert bei der Berechnung der Varianz eines Bildes -java-

Ich benutze die folgende Formel "var (x) = E (x²) -E (x) ²".

private void openActionPerformed(java.awt.event.ActionEvent evt) {          
    LoadImage loadImage = new LoadImage(null); 
    int w, h; 
    BufferedImage image; 
    float somR = 0; 
    int somG = 0; 
    int somB = 0; 
    int valR[][]; 
    int[][] valG; 
    int valB[][]; 
    double meanR = 0; 
    double meanG = 0; 
    double meanB = 0; 
    int nbpixl = 0; 
    try { 
     if (loadImage.loadImage(jScrollPane1)) { 
      int pixel = 0; 

      image = loadImage.getImage(); 
      w = image.getWidth(); 
      h = image.getHeight(); 
      System.out.println("width, height: " + w + ", " + h); 
      nbpixl = w * h; 

      valR = new int[h][w]; 
      valB = new int[h][w]; 
      valG = new int[h][w]; 
      for (int i = 0; i < h; i++) { 
       for (int j = 0; j < w; j++) { 

        pixel = image.getRGB(j, i); 
        //rgb argb 

        //int alpha = (pixel >> 24) & 0xff; 
        int red = (pixel >> 16) & 0xff; 
        int green = (pixel >> 8) & 0xff; 
        int blue = (pixel) & 0xff; 

        valR[i][j] = red; 
        somR += red; 

        valG[i][j] = green; 
        somG += green; 

        valB[i][j] = blue; 
        somB += blue; 

        System.out.println(""); 

       } 

      } 

      System.out.println("red " + somR); 
      System.out.println("green " + somG); 
      System.out.println("blue " + somB); 
      meanR = somR/nbpixl; 
      meanG = somG/nbpixl; 
      meanB = somB/nbpixl; 
      System.out.println("meanR" + meanR); 
      System.out.println("meanV" + meanG); 
      System.out.println("meanB" + meanB); 



      float summSquareR = somR * somR; 
      float meanSquareR = summSquareR/nbpixl; 

      System.out.println("summSquareR" + summSquareR); 
      System.out.println("meanSquareR" + meanSquareR); 
      //float varRrr=(float) (meanSquareR-meanR*meanR); 

      //var (x) = E (x²) -E (x) ² 

      byte varR = (byte) (255f * (meanSquareR - meanR * meanR)); 
      // byte varG=(byte)(225f*((somG*somG)/nbpixl)-((somG/nbpixl)*(somG/nbpixl))); 
      System.out.println(somB + "\t" + somR + "\t" + somG); 
      System.out.println("varR\t" + varR); 

     } 
    } catch (IOException ex) { 
     Logger.getLogger(var_img.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

Und für das Ergebnis Breite, Höhe: 259, 194

rot 5.137.653,0

grün 4165933

blau 4142841

meanR102.24999237060547

meanV82. 0

meanB82.0

summSquareR2.63954786E13

meanSquareR5.2532496E8

4142841 5137653,0 4165933

Varr -1

+0

Sieht auf den ersten Blick wie ein Überlauf aus. Warum werfen Sie auf "Byte"? – Marco13

+0

Ich hatte zwei Gründe * 1 * ist, dass wir in der Bildverarbeitung Intensitäten mit reellen Werten zwischen 0 und 1 behandeln. Deshalb muss ich ganzzahlige Werte von 0 bis 255 in reelle Werte umwandeln 0 ... 1 * 2 * wird die Fortsetzung dieses Codes sein, ich möchte einen Schwellenwert (exp 0,25) wählen, um jedes Bild in vier (Quadtree) schneiden, wenn die Rahmenvarianz den Schwellenwert – Younes27

+0

Ich versuchte mit float Float varR = (float) ((meanSquareR - meanR * meanR)); Und das Ergebnis ** varR 5.25314496E8 ** – Younes27

Antwort

0

Sie haben die Formel zu verstehen:

E[X^2]=(x1*x1+x2*x2+...+xn*xn)/n 

Ein richtiger Weg, um diese Formel zu verwenden, ist die folgende - d und d2 das gleiches kommen soll:

int[] x={1, 2, 5, 7}; 
int s=0; 
for(int i=0; i<x.length; i++) s+=x[i]; 
double m=s/4.; 
double d=0; 
for(int i=0; i<x.length; i++) d+=(x[i]-m)*(x[i]-m); 
d/=4.; 
int s2=0; 
for(int i=0; i<x.length; i++) s2+=x[i]*x[i]; 
double m2=s2/4.; 
double d2=m2-m*m; 

System.out.println(m+" "+d+" "+d2+" "+m2); 
+0

Danke gpasch Also hier habe ich versucht, die beiden Methoden zu überprüfen, ob es funktioniert Für Bild 1 waren die beiden Werte identisch Aber mit dem Bild 2 habe ich negativen Wert in der 2 Methode – Younes27

0

Code eingeben hier

private void openActionPerformed(java.awt.event.ActionEvent evt) { 
    LoadImage loadImage = new LoadImage(null); 
    int w = 0, h = 0; 
    BufferedImage image; 
    float somR = 0; 
    int somG = 0; 
    int somB = 0; 
    int valR[][]; 
    int[][] valG; 
    int valB[][]; 
    float meanR = 0; 
    float meanG = 0; 
    float meanB = 0; 
    int nbpixl = 0; 

    float square_Red = 0, square_Blue = 0, square_Green = 0; 
    //The sum of pixels for each color 
    int sum_Square_Red = 0, sum_Square_Blue = 0, sum_Square_Green = 0; 
    // The square sum of the pixels for each color 
    float varR = 0, varG = 0, varB = 0;//The variance of each color 
    try { 
     if (loadImage.loadImage(jScrollPane1)) { 
      int pixel = 0; 

      image = loadImage.getImage(); 
      w = image.getWidth(); 
      h = image.getHeight(); 
      System.out.println("width, height: " + w + ", " + h); 
      nbpixl = w * h; 

      valR = new int[h][w]; 
      valB = new int[h][w]; 
      valG = new int[h][w]; 
      for (int i = 0; i < h; i++) { 
       for (int j = 0; j < w; j++) { 
        pixel = image.getRGB(j, i); 
        int red = (pixel >> 16) & 0xff; 
        int green = (pixel >> 8) & 0xff; 
        int blue = (pixel) & 0xff; 

        valR[i][j] = red; 
        somR += red; 

        square_Red = red * red; 
        sum_Square_Red += square_Red; 

        valG[i][j] = green; 
        somG += green; 

        square_Green = green * green; 
        sum_Square_Green += square_Green; 

        valB[i][j] = blue; 
        somB += blue; 

        square_Blue = blue * blue; 
        sum_Square_Blue += square_Blue; 

       } 

      } 

      //la moyenne de pixels dechaque couleurs 
      meanR = somR/nbpixl; 
      meanG = somG/nbpixl; 
      meanB = somB/nbpixl; 
      //meanB = somB/nbpixl * 255.0f; 

      //1 method of calculating the variance 
      System.out.println("1 method of calculating the variance\n"); 
      float var[] = new float[3]; 
      for (int i = 0; i < h; i++) { 
       for (int j = 0; j < w; j++) { 

        varR += (meanR - valR[i][j]) * (meanR - valR[i][j]); 
        varG += (meanG - valG[i][j]) * (meanG - valG[i][j]); 
        varB += (meanR - valB[i][j]) * (meanB - valB[i][j]); 

       } 

      } 

      var[0] = (varR/nbpixl); 

      var[1] = (varG/nbpixl); 

      var[2] = (varB/nbpixl); 

      float var_img = ((var[0] + var[1] + var[2])/nbpixl); 

      System.out.println("var=\t"+var[0] + "\t"+ var[1] + "\t"+                 var[2]); 
      System.out.println("var of image=\t" + var_img); 

      //2 method of calculating the variance 
      System.out.println("2 method of calculating the variance\n"); 

      float varR1 = sum_Square_Red/nbpixl - (meanR * meanR); 
      float varG1 = sum_Square_Green/nbpixl - (meanG * meanG); 
      float varB1 = sum_Square_Blue/nbpixl - (meanB * meanB); 
      float mean_img1 = ((varR1 + varG1 + varB1)/nbpixl); 

     System.out.println("var=\t" + varR1 + "\t" + varG1 + "\t" + varB1); 
      System.out.println("var of image=\t" + mean_img1); 

     } 

    } catch (IOException ex) { 
     Logger.getLogger(var_img1.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

Und für das Ergebnis der Bild 1

Breite, Höhe: 259, 194

1 Methode zur Berechnung der Varianz

Varr = 7598,217 varg = 5033,452 varB = 4910,8223

Var von Bild = 0,34913212

2 Methode der Varianzberechnungs

2 Verfahren zur Berechnung der Varianz

Varr = 7597,9395 varg = 5183,0 varB = 4994.0

Var Bild = 0.3537583



Und für Bild 2

Breite, Höhe: 620, 349 1 Verfahren zur Berechnung der Varianz

Varr = 991,2626 varg = 1525,1627 varB = 1280,9857

var of image = 0.017549733

2 methode von calc ulating die Varianz

Varr = -52.462,875 Varg = -50.101,0 -50.592,0 varB =

var von image = -0,70780975


Und hier sind die zwei Bilder, die ich image1 image

verwendet
+0

Das Problem wird durch Ändern der Int-Typ zu Float von Code: int sum_Square_Red = 0, sum_Square_Blue = 0, sum_Square_Green = 0; Code Kann das Problem sein Acause ein Überlauf ..... – Younes27

Verwandte Themen