Gauss Filter Algorithmus


#1
Hallo zusammen,

ich versuche zu Übungszwecken, den Gaussfilter zu programmieren. Das Einlesen der Bilddaten (integer ARGB) und die Bewegung der Faltungsmatrix (Spaltenweise) über das Bild funktioniert. Was auch funktioniert ist das korrekte positionieren der neuen Werte in das Array, das zurückgegeben wird.

Allerdings hänge ich an der Berechnung der Bilddaten (also Integerwerte, die die Farbinformation beinhalten) mit den Koeffizienten (auch Integer) der Faltungsmatrix (Zeile 17-18). Sprich die Faltung der Maske mit dem Bild. Noch ausführlicher: wie ich die Bildpixel mit den Koeffizienten der Faltungsmatrix multipliziere und später durch die Anzahl der Zahlen in der Maske teile, sodass ich ein leicht verschwommenes Bild erhalte.

Moment wird jedes Pixel eingelesen, verändert und in das Array "newValue" gespeichert, aber der Effekt von einem GaussFilter filter wird nicht erzielt.:rolleyes:

Ich poste vorerst mal nur die Methode mit dem Algorithmus. Sollte mehr Bedarf bestehen, füge ich das ganze Projekt hinzu.

Code:
public int[] algorithm(){
		
		//Array für berechnete Werte  
		int[] newValues=new int[(width-(maskSize-1))*(height-(maskSize-1))];
		
		//äußere geschachtelte Schleife, damit die Faltungmaske sich über das Bild bewegt. Spaltenweise
		for(int x=(maskSize-1)/2; x<width-(maskSize+1)/2;x++) {
			for(int y=(maskSize-1)/2; y<height-(maskSize+1)/2;y++) {
				//in diese Variable werden die Werte des Bildes gespeichert, die innherhalb der Faltungsmaske liegen 
				double sum=0;
				//innere geschachtelte Schleife,damit die Werte des Bildes(ARGB Integer) innherhalb der Faltungsmatrix
				for(int x1=0;x1<maskSize;x1++) {
					for(int y1=0;y1<maskSize;y1++) {
						int x2 = (x-(maskSize-1)/2+x1);
						int y2 = (y-(maskSize-1)/2+y1);
						//Wert des Pixels vom Bild (integerWert ARGB. z.B. -1238236 entspricht (255|237|27|36) * gewichteter Koeffizient der Faltungsmaske z.B. 4
						float value = (input[y2*width+x2] /*&0xff*/) 					  						   * (mask[y1*maskSize+x1]);
						sum =+ value;
					}
				}
//				double erg=sum/9;
				//Berechneter Wert wird in das Array geschrieben.
//				newValues[(y-((maskSize-1)/2)*(width-((maskSize-1))+(x-((maskSize-1)/2)] = 0xff000000 | ((int)erg << 16 | (int)erg << 8 | (int)erg);
				newValues[(y-(maskSize-1)/2)*(width-(maskSize-1))+(x-(maskSize-1)/2)] = 0xff000000 | ((int)sum << 16 | (int)sum << 8 | (int)sum);
			}
		}
		
		return newValues;
	}
Danke für jede Hilfe
 
#3
Danke Tom,

die Seite kannte ich vorher schon auch, aber ich habe irgendwie übersehen, dass sie auch ganze Klassen anbieten. Die Beispiele haben mir sehr geholfen.
 

Neue Beiträge