获取RGB值的方差和标准差Java图像处理

时间:2016-03-10 15:26:08

标签: java image image-processing

所以这是我的代码,用于获取红色值的方差(和标准偏差)。绿色和蓝色我也做了同样的事情。

    /*Red Variance*/
    public static double varianceRed(BufferedImage image){
        Color r = new Color(image.getRGB(0, 0));
        double mean = meanValueRed(image);
        double sumOfDiff = 0.0;

         for (int y = 0; y < image.getHeight(); ++y){
               for (int x = 0; x < image.getWidth(); ++x){
                               double colour = r.getRed() - mean;
                               sumOfDiff += Math.pow(colour, 2); 
                             }                   
                           }
        return sumOfDiff / ((image.getWidth() * image.getHeight()) - 1);
        }

    /*Red Standard Deviation*/
    public static double standardDeviationRed(BufferedImage image){
        return Math.sqrt(varianceRed(image));
    }

我的问题是,r,g,b的每个方法都返回0.0的方差,我真的无法理解为什么。我使用Java的栅格对平均亮度值做了同样的工作,它工作正常。现在我无法理解为什么颜色不起作用。我尝试了一切。知道为什么我得到0.0以及如何修复它?

1 个答案:

答案 0 :(得分:1)

您需要获取循环内每种颜色的像素,而不仅仅是(0,0)处的颜色:

public static double varianceRed(BufferedImage image) {
    double mean = meanValueRed(image);
    double sumOfDiff = 0.0;

    for (int y = 0; y < image.getHeight(); ++y) {
        for (int x = 0; x < image.getWidth(); ++x) {
             Color r = new Color(image.getRGB(x, y)); // Moved inside loop, with proper indexes
             double colour = r.getRed() - mean;
             sumOfDiff += Math.pow(colour, 2); 
         }
    }

    return sumOfDiff / ((image.getWidth() * image.getHeight()) - 1);
}

PS:您的代码中似乎也有一个大小为1x1的图片的错误。 ; - )