0

我正在尝试编写一个程序,该程序将使用高斯滤波器从图像中去除噪声。我正在尝试编写以下代码:

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;
            }
        }
    }
}

但我没有消除噪音,而是让图像变暗。我做错了什么?

前

后

高斯噪声是概率密度等于正态分布概率密度的统计噪声,也称为高斯噪声。换句话说,这种噪声可以取的值具有高斯分布。以卡尔·高斯命名。

一种特殊情况是高斯白噪声,那么任何给定时间的值都是独立且均匀分布的随机变量(这意味着它们一起不相关)。在对通信信道进行测试和建模时,使用高斯噪声作为加性白噪声来生成加性高斯白噪声。

在电信领域,通信信道会受到来自各种自然来源的宽带高斯噪声的影响,例如导体中原子的热振动(热噪声或约翰逊-奈奎斯特噪声)、散粒噪声、来自地球或其他温暖物体的黑体辐射,以及来自天体,例如太阳

4

1 回答 1

0

您正在创建一个 3*3 高斯模板w,但您仅使用中心元素w[1][1],而不是计算当前位置周围 9 个像素的加权组合。

这有效地将所有像素值与一个常数值相乘,该常w[1][1]数值低于 1,只产生原始图像的较暗版本。

于 2021-10-20T09:43:41.563 回答