Kantenerkennung mit Hough-Transformation (Python) berechnet zu wenig Linien

Stannis

Lieutenant
Registriert
Juli 2011
Beiträge
602
Ich gehe mal davon aus, dass das hier besser als im "Programmieren"-Unterforum aufgehoben ist, da es hier weniger ums Coden an sich geht

Ich versuche gerade mit OpenCV die Geraden in Bildern zu finden.
Ich folge hierbei direkt der Anleitung des Projektes.

Allerdings sehen meine Ergebnisse (siehe Anhang) fundamental anders aus. Ich habe hier einfach direkt das erste Codebeispiel aus dem Link oben benutzt. Zusätzlich hänge Ich das Bild mit den reinen Kanten an, das völlig korrekt zu sein scheint.
Das erstrebte Endergebnis unterscheidet sich allerdings fundamental von dem auf der Seite, Ich habe nur eine winzige rote Linie; bei weitem nicht alle geraden Kanten werden beschrieben. Auch mit anderen Bildern erhalte Ich ähnlich enttäuschende Ergebnisse.

Was mache Ich falsch?
 

Anhänge

  • Antenne.jpg
    Antenne.jpg
    2,4 MB · Aufrufe: 371
  • antenne-kanten.jpg
    antenne-kanten.jpg
    3,6 MB · Aufrufe: 418
  • Antennenkanten.jpg
    Antennenkanten.jpg
    2,9 MB · Aufrufe: 399
Ich meinte direkt die beiden Codebeispiele aus dem obigen Link, etwa No. 1:

Python:
import cv2
import numpy as np

img = cv2.imread('antenne.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)

lines = cv2.HoughLines(edges,1,np.pi/180,200)
for rho,theta in lines[0]:
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a*rho
    y0 = b*rho
    x1 = int(x0 + 1000*(-b))
    y1 = int(y0 + 1000*(a))
    x2 = int(x0 - 1000*(-b))
    y2 = int(y0 - 1000*(a))

    cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2)

cv2.imwrite('houghlines3.jpg',img)
 
@Stannis openCV auf mein macOS bringen ist mir grade etwas zu stressig. Das Problem ist meines Erachtens dieser Aufruf:
Python:
lines = cv2.HoughLines(edges,1,np.pi/180,200)
Das vorletzte Argument steuert die "Feinheit" der zulässigen Winkel (in diesem Fall in 1°-Schritten), das letzte Argument ist für die Bildgröße gedacht. Wenn ich mich nicht irre, sind die 200 hier die Hälfte der Bilddiagonale des Testbildes aus dem verlinkten Tutorial. Da Du ein deutlich höher aufgelöstes Bild verwendest, solltest Du denke ich mal sowas wie 2620 als letztes Argument versuchen. Die Rechenzeit und der Speicherbedarf könnten sich merklich vergrößern.
 
Du hast von der Stoßrichtung her recht, man kann an den Parametern noch viel stellen, etwa an der Empfindlichkeit des Kantendetektors.

Für mich hat den Unterschied verursacht, die 200 zu verstellen, die die minimal geforderte Distanz zwischen den Linien oder so darzustellen scheint. Ich habe es auf 100 gesetzt, und das Ergebnis war deutlich besser.
Dazu musste Ich aber den greisligen C++ Kern ansehen, mit Python kommt man da ned weit
 
@Stannis Ja, da ist die Dokumentation auf der Website irgendwie ein bisschen gewöhnungsbedürftig. Wenn Du es jetzt hinbekommen hast, wunderbar.

Solltest Du nochmal was antworten, markier mich doch am besten. Dann krieg ichs auch mit :)
 
Zurück
Oben