Seite 1 von 1

Gerade in Bild finden

Verfasst: Mittwoch 27. Januar 2010, 15:12
von tjuXx
Hallo,
ich bin gerade auf der Suche nach einer Möglichkeit in den Pixeln eines Bildes zwei Gerade zu finden, und deren Schnittpunkt zu bestimmen.

Folgendes Bild habe ich als Quelle. Es ist ein Laser, der auf eine ca. 90° Kante von zwei Metallplatten trifft. Der Schnittpunkt der Platten soll bestimmt werden.

Bild

Im erste Schritt habe ich durch einen Theshold ein Binarbild erzeugt:

Bild

Jetzt ist mein Plan die weißen Pixel als Punkt in einem Koordinatensystem zu interpretieren. So hoffe ich auf die zwei Geraden zu kommen. Habe mal gesehen das Excel sowas kann, aus einer Punktwolke eine Funktion mitteln.

Habe die Geraden zur verdeutlichung mal mit Gimp eingezeichnet.

Bild

Der Schnittpunkt der beiden Geraden ist dann ja leicht zu berechnen.

Hat jemand eine Idee, oder einen Tipp für mich wie ich die beiden Geraden berechnen kann?

Auch über alternative Lösungsweg würde ich mich freuen.


Viele Grüße tjuXx

Verfasst: Mittwoch 27. Januar 2010, 15:17
von EyDu
Hallo

Das Stichwort lautet Hough-Transformation. Wenn du zu faul bist das selber zu implementieren, dann benutze einfach Open CV.

Sebastian

Verfasst: Mittwoch 27. Januar 2010, 15:25
von tjuXx
Vielen Dank. Dann werd ich mich da mal schlau machen.

Verfasst: Donnerstag 28. Januar 2010, 10:24
von jimKnopf
Wenn du die Koordinaten der Punkte aus dem Bild raus bekommt, sollte Polyfit den Job machen können. Das macht ein Least Square Fit. Du kannst auch angeben, das du nur ein polynom erster Orndung haben willst.

zu finden ist polyfit im numpy packet.

Greetz
Jim

Verfasst: Donnerstag 28. Januar 2010, 11:04
von CM
Diese Aussage ist Unsinn, jimKnopf. Um damit ein verlässliches Ergebnis zu erhalten, müßte man erst das Rauschen filtern, einen Threshold applizieren und dann eine Linie nach der anderen rausziehen - insb. der letzte Schritt ist schwierig ohne a priori Information.
Mit der Hough-Transformation ist man viel schneller unterwegs - und erhält obendrein ein gutes Ergebnis.

Stefan van der Walt hat ein Beispiel auf seiner Homepage: http://mentat.za.net/
Bin sicher, dass er auch Hilfestellung bei Fragen gibt.

HTH
Christian

Verfasst: Donnerstag 28. Januar 2010, 11:08
von CM
PS Und auf der Wikipedia-Seite zur Transformation ist ein Link zu einer "Fast"-Variante. Könnte man vielleicht wrappen - je nachdem wie viele dieser Transformationen erwartet werden ...

Verfasst: Donnerstag 28. Januar 2010, 13:57
von HerrHagen
Das was du vorhast klingt für mich nach dem Lichtschnittverfahren. Dazu verwendet man meist andere Wege als die Hough-Transformation, da (bei entsprechender Positionierung der Kamerea) pro Bildspalte die Laserlinie nur einmal sichtbar werden sollte und damit das Problem so entsprechend einfacher wird. Eine gängige Variante, die auch von vielen 3D-Kameras implementiert wird, ist spaltenweise den Schwerpunkt aller Werte die oberhalb eines gewissen Schwellenwertes liegen zu berechen.
Also in etwa so (ohne spalteweise Anwendung):

Code: Alles auswählen

def center_of_gravity(hist, threshold=0):
    """
    >>> center_of_gravity(numpy.array([0,2,5,8,7,2]), 4)
    3.25
    >>> center_of_gravity(numpy.array([0,2,7,3,7,2]), 5)
    3.0
    >>> center_of_gravity(numpy.array([0,2,5,8,7,2]), 9)

    """

    hist_ = hist.copy()
    hist_ -= threshold
    thres = hist_ < 0
    if numpy.alltrue(thres):
        return None
    hist_[thres] = 0

    bins = numpy.arange(0, len(hist))
    return numpy.average(bins, weights=hist_)
Wenn ich deine Bildaufnahme sehe, bezweifle ich allerdings das dieses Verfahren wirken kann (zu viele störende Reflektionen). Das heißt für mich allerdings eher, dass du deine Bildaufnahme verbessern solltest, als auf ein komplexeres und weit rechenaufwändigeres Verahren (wie die Hough-Transformation) zu setzen. Versuch mal die Bildaufnahme so zu gestalten, dass wirklich nur die Laserlinie (und keine Reflektionen davon) sichtbar bleibt. In der Bildverabeitung ist eine gute Bildaufnahme meist mehr wert als die trickreichsten Algorithmen.

MFG HerrHagen