(Type mismatch??) Mein Sobel funktioniert nicht..



  • Ich denke nicht, dass das Problem am Sobel selbst liegt, weshalb ich den Eintrag hier poste. Mein Problem ist wahrscheinlich eher das auseinanderhalten von Datentypen. Vielleicht sieht ja hier einer was.

    #include "SobelFilter.h"
    
    void SobelFilter::filterfunction (cImage *src, cImage *dest, int x, int y) {
    	int maskx[] = {-1,0,1,-2,0,2,-1,0,1};
    	int masky[] = {1,2,1,0,0,0,-1,-2,-1};
    
    	int valx = 0;
    	int valy = 0;
        // für jedes Filterelement
    	for (int yd = -1; yd <= 1; yd++) {
    		for (int xd = -1; xd <= 1; xd++) {
    			unsigned  posx = xd + x;
    			unsigned  posy = yd + y;
    			// Wenn der Filter noch im Bild ist
    			// zähle den Filterwert hinzu
    			if (posx >= 0 && posy >= 0 && posx < src->getWidth()
    			 && posy < src->getHeight()) {
    				valx += (int)src->getPixel(posx,posy,0) *  maskx[yd * 3 + xd]; 
    				valy += (int)src->getPixel(posx,posy,0) *  masky[yd * 3 + xd];
    
    			}
    		}	
    	}
                    // was größer ist als 0xff (255), wird einfach entfernt.. 
    		valx = abs(valx);
    		valy = abs(valy);
    		if (valx > 0xff) valx = 0xff;
    		if (valy > 0xff) valy = 0xff;
    		// die Richtung der Kante 
    	     // int direction = (int)round(abs(atan ((float)valy / (float)valx )) * 2);
    	    // Der Anstieg der Kante
    		// int gradient = sqrt ((valx * valx) + (valy * valy)); 
    		// Kurzform - etwas ungenauer aber schneller 
    		// int gradient = (valy > valx) ? valy : valx ;
    
    		// Setzen der Farbwerte
    		dest->setPixel(x, y, valx, 0);
    		dest->setPixel(x, y, valx, 1);
    		dest->setPixel(x, y, valx, 2);
    }
    

    Die filterfunction wird von einer Funktion aufgerufen, die das ganze Bild abläuft also "foreach x ( foreach y (filterfunction)). Da ich noch andere Filter habe, ist das so ganz günstig, denk ich- ich implementiere immer nur die Filterfunktion neu.

    Auf jeden Fall hier mein Problem:
    Ich hab das Beispielbild von http://www.generation5.org/content/2002/im01.asp genutzt und mein Ergebnis ist- naja, anders. Ich hab bei mir die 5 in schwarz auf dem bild und nix anders- schon garnicht die Ränder.

    Meines Erachtens liegt hier ein Problem mit den Datentypen vor. Die Pixel sind breite * höhe * 3 Pixel (immer RGB) Ein Pixel ist ein unsigned char.

    Kann mir wer helfen das Ganze zu bereinigen?



  • Wenn ich raten müsste, würde ich auf einen Index-Fehler bei deinen Mask-Arrays tippen. xd und yd laufen von -1 bis +1, also graifst du auf die Elemente zwischen -4 (3*-1 + -1) und +4 (3*+1 + +1) zu, die teilweise außerhalb des gültigen Index-Bereiches liegen.



  • manchmal bin ich auch zu blöd- warum zum Geier fällt mir sowas einfaches nicht auf?
    Jetzt tuts was es soll 🙂 danke.

    P.S.: Man kann natürlich auch noch nen Schwellwert reinsetzen- falls es wer nutzen möchte.


Anmelden zum Antworten