Canny Operation



  • Hallo Leute,
    ich versuche gerade den Canny Algorithmus zu implementieren und habe noch ein paar Verständnisschwierigkeiten. Ich hoffe ihr könnt mir weiterhelfen.

    Ich habe bereits die Katen -Stärke und -Richtung für jeden Pixel berechnet und abgespeichert. Als nächstes folg die Non-Maximum-Supression.

    o Auf manchen Seiten ist angegeben, dass der aktuelle Pixel nur erhalten bleibt, wenn er im Bezug auf die Beiden Pixel orthogonal zur Kantenrichtung die Maximale Stärke hat. Wikipedia sagt, dass der Pixel mit allen 8 Nachbarn verglichen werden muss. Was ist nun richtig?

    Mein Code:

    for(int x = 1; x < width - 1; x++) {
    		for(int y = 1; y < height - 1; y++) {
    
    			switch(Pixel[x][y].direction)
    			{
    			case 0: // horizontale Kante
    				{
    					if(Pixel[x][y].strength < Pixel[x][y - 1].strength || Pixel[x][y].strength < Pixel[x][y + 1].strength)
     						Pixel[x][y].suppress = true;
    					 break;
    				}
    			 case 45: // links unten nach rechts oben
    				{
    					if(Pixel[x][y].strength < Pixel[x - 1][y - 1].strength || Pixel[x][y].strength < Pixel[x + 1][y + 1].strength)
    						Pixel[x][y].suppress = true;
                                             break;
    				}
    			case 90: // vertikale Kante
    				{
    					if(Pixel[x][y].strength < Pixel[x - 1][y].strength || Pixel[x][y].strength < Pixel[x + 1][y].strength)
    						Pixel[x][y].suppress = true;
                                             break;
    				}
    			case 135: // links oben nach rechts unten
    				{
    					if(Pixel[x][y].strength < Pixel[x + 1][y - 1].strength || Pixel[x][y].strength < Pixel[x - 1][y + 1].strength)
    						Pixel[x][y].suppress = true;
                                             break;
    				}
    			}
    		}
    	}
    

    o Wenn das bisher richtig implementiert wurde, müssen dann die unterdrückten Pixel im original Bild auf 0 gesetzt, folglich schwarz gefärbt werden, oder reicht es sie beim Ausführen der Schwellenwertoperation zu ignorieren?

    o Weiter wundert es mich, dass auch Pixel nicht unterdrückt werden, die überhaupt keine Kantenstärke haben. Wenn wir uns in einem komplett weißen Bereich des Bildes befinden haben die Kanten ja selbst ohne Kantenstärke nach dem Algorithmus eine Richtung. Und da alle Pixel die gleiche Stärke haben wird auch nichts unterdrückt.

    Ich hoffe ich verwirre euch nicht zu viel mit meiner eigenen Verwirrung und ihr könnt mir irgendwie zu klarheit verhelfen 😃

    Grüße Kromat



  • Hi

    Für solche Fragen kannst Du Dich an OpenCV orientieren:

    http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/canny_detector/canny_detector.html
    https://code.ros.org/trac/opencv/browser/trunk/opencv/modules/imgproc/src/canny.cpp?rev=3934

    Zu Übungszwecken einige Filter zu implementieren ist eine gute Sache. Im Produktivcode setze ich aber nur noch OpenCV ein, die Bibliothek ist einfach nicht zu schlagen 👍



  • Die Seite scheint ganz gut zu sein, hab auch ein bisschen Quellcode gefunden.
    Aber wenn es darum geht thrid Party Librarys zu verwenden bin ich immer ein wenig
    antriebslos. Ich programmiere auch am liebsten mit der WinAPI, weil ich so viel wie möglich selbst und so nah wie möglich am Betriebssystem arbeiten möchte.
    Deshalb bin ich auch kein Fan von Java oder C# :D.



  • Kromat schrieb:

    Die Seite scheint ganz gut zu sein, hab auch ein bisschen Quellcode gefunden.

    Kein Scheiß Sherlock. Ich hab dir ja auch die Implementierung des Canny-Operators verlinkt 😃

    Kromat schrieb:

    Aber wenn es darum geht thrid Party Librarys zu verwenden bin ich immer ein wenig
    antriebslos.

    Musst Du ja nicht verwenden, aber der Code beantwortet Deine Fragen.


Log in to reply