Мне нужно реализовать Gaussian Blur в Java для матриц 3x3, 5x5 и 7x7. Вы можете исправить меня, если я ошибаюсь:Java: реализация Gaussian Blur
Я матрица (M) 3х3 (среднее значение M (0, 0)):
1 2 1 2 4 2 1 2 1
Я беру один пиксель (Р) от изображения и для каждого пикселя ближайшего:
s = M(-1, -1) * P(-1, -1) + M(-1, 0) * P(-1, 0) + ... + M(1, 1) * P(1, 1)
, то разделение его общая стоимость матрицы:
P'(i, j) = s/M(-1, -1) + M(-1, 0) + ... + M(1, 1)
Это все, что делает моя программа. Я оставляю крайние пиксели не меняющимися.
Моя программа:
for(int i = 1; i < height - 1; i++){
for(int j = 1; j < width - 1; j++){
int sum = 0, l = 0;
for(int m = -1; m <= 1; m++){
for(int n = -1; n <= 1; n++){
try{
System.out.print(l + " ");
sum += mask3[l++] * Byte.toUnsignedInt((byte) source[(i + m) * height + j + n]);
} catch(ArrayIndexOutOfBoundsException e){
int ii = (i + m) * height, jj = j + n;
System.out.println("Pixels[" + ii + "][" + jj + "] " + i + ", " + j);
System.exit(0);
}
}
System.out.println();
}
System.out.println();
output[i * width + j] = sum/maskSum[0];
}
}
Я получаю source
из BufferedImage
так:
int[] source = image.getRGB(0, 0, width, height, null, 0, width);
Можете ли вы описать меня, Что случилось с моей программой?
какой тип ваш '' source' и output', мы можем видеть, декларация для них? Поскольку вы делаете преобразование в байт в 'Byte.toUnsignedInt ((byte) source [(i + m) * height + j + n]), и я не могу поверить, что ваше цветное изображение будет соответствовать пикселю в один байт , Любое усечение даст вам значение max 255, которое, если оно будет преобразовано в цветовое пространство RGB с тремя байтами/образцом, объяснит, почему ваш результат синий (т. Е. Отсутствует компоненты R и G). –
'int [] source = image.getRGB (0, 0, width, height, null, 0, width);' 'output' - это копия' source', поэтому мне нужно отфильтровать 3 раза? Для R и G? Как мне это сделать? – Wiszen
Самый переутомный способ получить отдельные значения r, g и b - использовать (ColorModel) [https://docs.oracle.com/javase/7/docs/api/java/awt/image/ColorModel.html] Если вы знаете, как хранятся данные, вы можете извлечь 4 байта из значения int для пикселя. r = rgbVal & 0xff, g = (rgbVal >> 8) & 0xff и т. д. –