#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, создавая только более темную версию исходного изображения.