2016-03-10 1 views
-1

Итак, вот мой код для получения дисперсии (и стандартного отклонения) значений красного цвета. Я сделал то же самое для Green и Blue.Получение отклонения и стандартного отклонения от значений RGB Обработка изображений Java

/*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)); 
    } 

Моя проблема в том, что каждый метод г, г, б возвращается дисперсию 0.0, и я на самом деле просто не могу обернуть мою голову вокруг почему. Я сделал то же самое для среднего значения яркости с использованием растра Java, и он отлично работает. Теперь я не могу понять, почему цвет не работает. Я все пробовал. Любая идея относительно того, почему я получаю 0.0 и как это можно исправить?

+1

возможно, потому что 'r' никогда не переназначается внутри цикла? –

+0

Вы только когда-либо получаете значение первого пикселя ('image.getRGB (0, 0)'), вы, вероятно, захотите получить значение для каждого пикселя внутри цикла. – haraldK

+0

@haraldK Привет, что я должен использовать для получения значения каждого пикселя? Спасибо за ваш вклад. – user1167596

ответ

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. ;-)

+0

это прекрасный. Спасибо, Харальд! Я посмотрю на эту ошибку ха-ха !! – user1167596

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