Ich muss Gaussian Blur in Java für 3x3, 5x5 und 7x7 Matrix implementieren. Können Sie mich korrigieren, wenn ich falsch:Java: Implementierung von Gaußscher Unschärfe
Ich habe eine Matrix (M) 3x3 (Mittelwert M (0, 0)):
1 2 1 2 4 2 1 2 1
ich ein Pixel nehmen (P) aus dem angezeigten Bild und für jedes nächste pixel:
s = M(-1, -1) * P(-1, -1) + M(-1, 0) * P(-1, 0) + ... + M(1, 1) * P(1, 1)
an dann Division es Gesamtwert der Matrix:
P'(i, j) = s/M(-1, -1) + M(-1, 0) + ... + M(1, 1)
Das ist alles, was mein Programm tut. Ich lasse extreme Pixel unverändert.
Mein Programm:
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];
}
}
ich source
von einem BufferedImage
wie folgt aus:
int[] source = image.getRGB(0, 0, width, height, null, 0, width);
Können Sie mich beschreiben, Was ist falsch an meinem Programm?
Welche Art ist Ihr 'source' und' output', können wir sehen ein Erklärung für sie? Weil Sie in byte.toUnsignedInt ((byte) source [(i + m) * height + j + n]) eine Umwandlung in Byte vornehmen und ich kann nicht glauben, dass Ihr Farbbild ein Pixel in ein einzelnes Byte paßt . Jede Abschneidung erlaubt Ihnen einen Wert von maximal 255, der - wenn er in einen RGB-Farbraum mit drei Bytes/Sample konvertiert wird - erklären würde, warum Ihr Ergebnis blau ist (d. H. Die R- und G-Komponenten fehlen). –
'int [] source = image.getRGB (0, 0, width, height, null, 0, width);' 'output' ist eine Kopie von' source', also muss ich 3 mal filtern? Für R und G? Wie kann ich es tun? – Wiszen
Der beste Weg, um individuelle r, g und b Werte zu erhalten, ist die Verwendung eines (ColorModel) [https://docs.oracle.com/javase/7/docs/api/java/awt/image/ColorModel.html] Wenn Sie wissen, wie die Daten gespeichert sind, können Sie die 4 Bytes aus dem int-Wert für das Pixel extrahieren. r = rgbVal & 0xff, g = (rgbVal >> 8) & 0xff etc. –