计算图像方差时为负值-java-

计算图像方差时为负值-java-,java,swing,image-processing,variance,Java,Swing,Image Processing,Variance,这里我尝试计算图像的方差,从图像中每种颜色的方差开始(我计算了红色的方差,但结果是-1) 我使用以下公式“var(x)=E(x²)-E(x²)” private void openActionPerformed(java.awt.event.ActionEvent evt){ LoadImage LoadImage=新的LoadImage(空); int w,h; 缓冲图像; float-somR=0; int-somG=0; int-somB=0; 整数[][]; int[]valG; 国际增

这里我尝试计算图像的方差,从图像中每种颜色的方差开始(我计算了红色的方差,但结果是-1)

我使用以下公式“var(x)=E(x²)-E(x²)”

private void openActionPerformed(java.awt.event.ActionEvent evt){
LoadImage LoadImage=新的LoadImage(空);
int w,h;
缓冲图像;
float-somR=0;
int-somG=0;
int-somB=0;
整数[][];
int[]valG;
国际增值税[][];
双平均值=0;
双平均值=0;
双平均值b=0;
int-nbpixl=0;
试一试{
if(loadImage.loadImage(jScrollPane1)){
整数像素=0;
image=loadImage.getImage();
w=image.getWidth();
h=image.getHeight();
系统输出打印项次(“宽度、高度:+w+”、“+h”);
nbpixl=w*h;
valR=新整数[h][w];
valB=新整数[h][w];
valG=新整数[h][w];
对于(int i=0;i>24)&0xff;
int red=(像素>>16)和0xff;
绿色整数=(像素>>8)&0xff;
蓝色整数=(像素)&0xff;
valR[i][j]=红色;
somR+=红色;
valG[i][j]=绿色;
somG+=绿色;
valB[i][j]=蓝色;
somB+=蓝色;
System.out.println(“”);
}
}
系统输出打印项次(“红色”+somR);
系统输出打印项次(“绿色”+somG);
系统输出打印项次(“蓝色”+somB);
平均值=somR/nbpixl;
平均值=somG/nbpixl;
平均值b=somB/nbpixl;
系统输出打印项次(“平均值”+平均值);
系统输出打印项次(“平均值”+平均值);
系统输出打印项次(“平均值”+平均值);
浮点平方和=somR*somR;
浮点均方=summSquareR/nbpixl;
System.out.println(“总和平方器”+总和平方器);
System.out.println(“均方”+均方);
//浮点VARRR=(浮点)(均方均方均方*均方);
//var(x)=E(x²)-E(x)²
字节varR=(字节)(255f*(均方-均方*均方));
//字节变量=(字节)(225f*((somG*somG)/nbpixl)-(somG/nbpixl)*(somG/nbpixl));
System.out.println(somB+“\t”+somR+“\t”+somG);
System.out.println(“varR\t”+varR);
}
}捕获(IOEX异常){
Logger.getLogger(var_img.class.getName()).log(Level.SEVERE,null,ex);
}
}
结果呢 宽度、高度:259194

红色5137653.0

绿色4165933

蓝色4142841

平均数102.24999237060547

平均值82.0

平均值82.0

Summar2.63954786E13

均方5.2532496E8

4142841 5137653.0 4165933


varR-1

您必须理解以下公式:

E[X^2]=(x1*x1+x2*x2+...+xn*xn)/n
使用此公式的正确方法如下-d和d2的结果应相同:

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);
int[]x={1,2,5,7};
int s=0;
对于(int i=0;i在此处输入代码

    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);
    }
}
private void openActionPerformed(java.awt.event.ActionEvent evt){
LoadImage LoadImage=新的LoadImage(空);
int w=0,h=0;
缓冲图像;
float-somR=0;
int-somG=0;
int-somB=0;
整数[][];
int[]valG;
国际增值税[][];
浮动平均值=0;
浮动平均值=0;
浮动平均值b=0;
int-nbpixl=0;
浮动方块红色=0,方块蓝色=0,方块绿色=0;
//每种颜色的像素总和
整数平方和红色=0,平方和蓝色=0,平方和绿色=0;
//每种颜色像素的平方和
float varR=0,varG=0,varB=0;//每种颜色的方差
试一试{
if(loadImage.loadImage(jScrollPane1)){
整数像素=0;
image=loadImage.getImage();
w=image.getWidth();
h=image.getHeight();
系统输出打印项次(“宽度、高度:+w+”、“+h”);
nbpixl=w*h;
valR=新整数[h][w];
valB=新整数[h][w];
valG=新整数[h][w];
对于(int i=0;i>16)和0xff;
绿色整数=(像素>>8)&0xff;
蓝色整数=(像素)&0xff;
valR[i][j]=红色;
somR+=红色;
红色=红色*红色;
和方红+=方红;
valG[i][j]=绿色;
somG+=绿色;
方形_绿色=绿色*绿色;
和方绿色+=方绿色;
valB[i][j]=蓝色;
somB+=蓝色;
方蓝色=蓝色*蓝色;
和方蓝+=方蓝;
}
}
//拉莫耶恩·德查克·库勒酒店
平均值=somR/nbpixl;
平均值=somG/nbpixl;
平均值b=somB/nbpixl;
//平均值b=somB/nbpixl*255.0f;
//1计算方差的方法
System.out.println(“计算方差的1种方法”);
浮动var[]=新浮动[3];
对于(int i=0;i    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);
    }
}