Zunächst wandeln Sie Ihr Ergebnis von Float zu Int in jedem Zyklus der Schleife unnötig (und fälschlicherweise). Dein red
, green
und blue
Sollte vom Typ Float sein und sollten erst nach der Faltung wieder zur Ganzzahl gegossen werden (wenn sie zurück zu RGB konvertiert werden):
float red=0.0f, green = 0.0f, blue = 0.0f
for(int i = x;i<x+3;i++){
for(int j = y;j<y+3;j++){
int color = a.getRGB(i,j);
red += ((color >> 16) & 0xff)*matrix[(i-x)*3+j-y];
green += ((color >> 8) & 0xff)*matrix[(i-x)*3+j-y];
blue += ((color >> 0) & 0xff)*matrix[(i-x)*3+j-y];
}
}
return (a.getRGB(x, y)&0xFF000000) | (((int)red) << 16) | (((int)green) << 8) | ((int)blue);
Die Blutung der Farben in Ihrem Ergebnis wird verursacht, weil Ihre Koeffizienten in matrix
sind falsch:
0.1710991401561097f + 0.2196956447338621f + 0.1710991401561097f + 0.2196956447338621f + 0.28209479177387814f + 0.2196956447338621f + 0.1710991401561097f + 0.2196956447338621f + 0.1710991401561097f = 1.8452741
Die Summe der Koeffizienten in einer verwischenden Faltungsmatrix sollte 1,0 betragen. Wenn Sie diese Matrix auf ein Bild anwenden, erhalten Sie möglicherweise Farben, die über 255 sind. Wenn dies passiert, "bluten" in den nächsten Kanal (blau bis grün usw.). Ein völlig grünes Bild mit dieser Matrix würde zu:
green = 255 * 1.8452741 ~= 471 = 0x01D7; rgb = 0xFF01D700;
Das ist ein weniger intensives Grün mit einem Hauch von Rot.
Sie können dies beheben, indem Sie die Koeffizienten durch teilen 1.8452741
, aber du willst das sicherstellen:
(int)(255.0f * (sum of coefficients)) = 255
Wenn nicht, müssen Sie eine Überprüfung hinzufügen, die die Größe der Kanäle auf 255 beschränkt, und lassen Sie sie sich nicht umwickeln. Z.B:
if (red > 255.0f)
red = 255.0f;
In Bezug auf Effizienz/Optimierung:
Es könnte sein, dass der Geschwindigkeitsunterschied durch dieses unnötige Casting und Mathematik erklärt werden kann, aber ein wahrscheinlicherer Kandidat ist die Art und Weise, wie Sie auf das Bild zugreifen. Ich bin mit BufferedImage und Raster nicht vertraut genug, um Sie auf die effizienteste Weise zu beraten, um auf den zugrunde liegenden Bildpuffer zuzugreifen.