我正在尝试编写一个程序,该程序将使用高斯滤波器从图像中去除噪声。我正在尝试编写以下代码:
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;
}
}
}
}
但我没有消除噪音,而是让图像变暗。我做错了什么?
高斯噪声是概率密度等于正态分布概率密度的统计噪声,也称为高斯噪声。换句话说,这种噪声可以取的值具有高斯分布。以卡尔·高斯命名。
一种特殊情况是高斯白噪声,那么任何给定时间的值都是独立且均匀分布的随机变量(这意味着它们一起不相关)。在对通信信道进行测试和建模时,使用高斯噪声作为加性白噪声来生成加性高斯白噪声。
在电信领域,通信信道会受到来自各种自然来源的宽带高斯噪声的影响,例如导体中原子的热振动(热噪声或约翰逊-奈奎斯特噪声)、散粒噪声、来自地球或其他温暖物体的黑体辐射,以及来自天体,例如太阳