java удаляет гауссов шум

#java #gaussian #noise #gauss

Вопрос:

Я пытаюсь написать программу, которая удаляла бы шум из изображения с помощью фильтра Гаусса. Я пытаюсь написать следующий код:

 public class Main {
    public static void main(String[] args) {
        File file = new File("src/main/resources/123.jpg");
        BufferedImage source;

        try {
            source = ImageIO.read(file);
            BufferedImage result = new BufferedImage(source.getWidth(), source.getHeight(), source.getType());

            int n = 3;
            double[][] w = new double[n][n];
            genGaussTemplate(w, n, 0.5);
            for (int i = 1; i < source.getWidth() - 1; i  ) {
                for (int j = 1; j < source.getHeight() - 1; j  ) {

                    // Получаем цвет текущего пикселя
                    Color color = new Color(source.getRGB(i, j));

                    // Получаем каналы этого цвета
                    int blue = color.getBlue();
                    int red = color.getRed();
                    int green = color.getGreen();

                    red = (int) ((float) red * w[1][1]);
                    green = (int) ((float) green * w[1][1]);
                    blue = (int) ((float) blue * w[1][1]);

                    //  Cоздаем новый цвет
                    Color newColor = new Color(red, green, blue);

                    // И устанавливаем этот цвет в текущий пиксель результирующего изображения
                    result.setRGB(i, j, newColor.getRGB());
                }
            }
            // Сохраняем результат в новый файл
            File output = new File("src/main/resources/output/321.jpg");
            ImageIO.write(result, "jpg", output);
        }
        catch (IOException e) {
            System.out.println("Произошла ошибка - "   e.getMessage());
        }
    }

    static void genGaussTemplate(double[][] window, int ksize, double sigma) {
        final double pi = 3.1415926;
        int center = ksize / 2;
        double x2, y2;
        double sum = 0;
        for (int i = 0; i < ksize; i  ) {
            x2 = Math.pow(i - center, 2);
            for (int j = 0; j < ksize; j  ) {
                y2 = Math.pow(j - center, 2);
                double g = Math.exp(-(x2   y2) / (2 * sigma * sigma));
                g /= 2 * pi * sigma * sigma;
                sum  = g;
                window[i][j] =g;
            }
        }
        for (int i = 0; i < ksize; i  ) {
            for (int j = 0; j < ksize; j  ) {
                window[i][j] /=sum;
            }
        }
    }
}

 

Но вместо удаления шума я получаю затемнение изображения. Что я делаю не так?

до

после

Гауссов шум-это статистический шум, плотность вероятности которого равна плотности вероятности нормального распределения, также известного как гауссовский. Другими словами, значения, которые может принимать такой шум, имеют гауссово распределение. Назван в честь Карла Гаусса.

Частным случаем является белый гауссов шум, тогда значения в любой момент времени являются независимыми и равномерно распределенными случайными величинами (что означает, что вместе они не коррелируют). При тестировании и моделировании каналов связи гауссовый шум используется в качестве аддитивного белого шума для генерации аддитивного белого гауссова шума.

В телекоммуникациях на каналы связи может влиять широкополосный гауссовский шум, исходящий от различных природных источников, таких как тепловые колебания атомов в проводниках (тепловой шум или шум Джонсона-Найквиста), шум выстрела, излучение черного тела от земли или других теплых объектов, а также от небесных источников, таких как Солнце

Ответ №1:

Вы создаете шаблон Гаусса 3*3 w , но используете только центральный элемент w[1][1] вместо вычисления взвешенной комбинации из 9 пикселей вокруг вашего текущего положения.

Это эффективно умножает все значения пикселей на постоянное значение w[1][1] , которое имеет значение ниже 1, создавая только более темную версию исходного изображения.