Hough-Transformation für Kreise

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
yiiit
User
Beiträge: 10
Registriert: Dienstag 8. Mai 2012, 15:22

Hallo!

Ich benötige ein Hough-Transformation, die Kreise findet - die lineare habe ich schon und sie ist wie folgt implementiert:

Code: Alles auswählen

    def houghtf_lin(self, img, angles=None):
        """Perform the straight line Hough transform.
    
        Input:
          img - a boolean array
          angles - in degrees
    
        Output:
          H - the Hough transform coefficients
          distances
          angles
        
        """
        
        if img.ndim != 2:
            raise ValueError("Input must be a two-dimensional array")
    
        img = img.astype(bool)
        
        if not angles:
            angles = np.linspace(-90,90,180)
    
        theta = angles / 180. * np.pi
        d = np.ceil(np.hypot(*img.shape))
        nr_bins = 2*d - 1
        bins = np.linspace(-d,d,nr_bins)
        out = np.zeros((nr_bins,len(theta)),dtype=itype)
    
        rows,cols = img.shape
        x,y = np.mgrid[:rows,:cols]
    
        for i,(cT,sT) in enumerate(zip(np.cos(theta),np.sin(theta))):
            rho = np.round_(cT*x[img] + sT*y[img]) - bins[0] + 1
            rho = rho.astype(itype)
            rho[(rho < 0) | (rho > nr_bins)] = 0
            bc = np.bincount(rho.flat)[1:]
            out[:len(bc),i] = bc
    
        return out,angles,bins
Liegt ein Punkt auf der entsprechenden Geraden, wird der Wert in der Ergebnismatrix um eins erhöht und man erkennt an hellen Punkten, dass dort eine Gerade im Ausgangsbild war.

Wie kann ich diese Hough-Transformation umschreiben, sodass sie auch Kreise erkennt?

Wahrscheinlich muss ich die Gleichung r = x*sin(a) + y*cos(a) umschreiben in die Form r^2 = (x-a)^2 + (y-b)^2..

Aber dann habe ich eine Dimension mehr?

Viele Grüße

-yiiit-
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Mehr Freiheitsgrade resultieren in mehr Dimensionen.
Das Leben ist wie ein Tennisball.
yiiit
User
Beiträge: 10
Registriert: Dienstag 8. Mai 2012, 15:22

yep, das habe ich nachvollzogen.

aber ich habe nach wie vor Probleme den Code für die lineare Hough-Transformation in den für die zirkulare zu übertragen - das muss doch funktionieren, das Verfahren bleibt ja prinzipiell gleich, lediglich die Gleichung muss angepasst werden.. oder?
deets

Schau dir doch mal die OpenCV an - die kann das. Da kannst du vielleicht abkupfern.
yiiit
User
Beiträge: 10
Registriert: Dienstag 8. Mai 2012, 15:22

ich versuche grad das openCV-package für python zu installieren - scheitere aber..
habe mir diese exe heruntergeladen:

http://sourceforge.net/projects/opencvlibrary/

das ist aber nur ein selbstextrahierendes File und ich hab keine Ahnung wohin ich die Dateien verschieben muss.. :/
deets

wer hat denn von installieren gesprochen? schau dir doch einfach den *CODE* an. Der ist natuerlich dann in C/C++, aber sollte trotzdem klappen. Oder willst du die OpenCV statt deinem eigenen Kram benutzen? Dann musst du's installieren, klar. Aber ohne Angabe von Python-Version, OpenCV-Version, Betriebssystem ist deine Fehlermeldung ne Nullnummer.
yiiit
User
Beiträge: 10
Registriert: Dienstag 8. Mai 2012, 15:22

eben, ich wollte es installieren..
habe python 2.7 und windows vista 32bit als betriebssystem.
openCV hab ich in der version 2.4.1 heruntergeladen unter dem eben geposteten link.
yiiit
User
Beiträge: 10
Registriert: Dienstag 8. Mai 2012, 15:22

also, ich habe nun openCV 2.4.0 installiert und versuche das Problem damit zu lösen.

Mein Codeausschnitt lautet:

Code: Alles auswählen

        
        im = Image.fromarray(img)
        cv_im = cv.CreateImageHeader(im.size, cv.IPL_DEPTH_8U, 3)
        cv.SetData(cv_im, im.tostring())
        
        gray = cv.CreateImage(cv.GetSize(cv_im), 8, 1)
        storage = cv.CreateMat(cv_im.width, 1, cv.CV_32FC3)

        circles = cv.HoughCircles(gray, storage, cv.CV_HOUGH_GRADIENT,1,1, 200, 100) 

        print np.asarray(storage)
wobei img ein 12x12 großes numpy-array ist.

Führe ich diesen Code nun aus, erhalte ich folgende Fehlermeldung:
OpenCV Error: Bad argument (unrecognized or unsupported array type) in unknown function, file ..\..\..\OpenCV-2.4.0\modules\core\src\array.cpp, line 967
außerdem erhalte ich einen Runtime Error..

Woran liegt das?

Ich habe ein paar Zeilen Testcode geschrieben, die er auch kompiliert und ausgibt:

Code: Alles auswählen

import cv, numpy

mat = cv.CreateMat(3, 5, cv.CV_32FC3)
print type(mat)

cv.Set(mat, 7)
a = numpy.asarray(mat)
print a
type(mat) aus diesem Beispiel ist identisch mit type(storage) aus dem Programmcode, nämlich <type 'cv2.cv.cvmat'>.

Wer weiß Rat?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Kopiere doch bitte die gesamte Fehlermeldung, dann sieht man zumindest die Zeile in der der Fehler auftritt.
Das Leben ist wie ein Tennisball.
yiiit
User
Beiträge: 10
Registriert: Dienstag 8. Mai 2012, 15:22

hm? Welchen Fehler meinst du genau? Den openCV-Fehler habe ich gepostet, und der RuntimeError ist so eine Dialogbox, die aufpoppt.

Der Fehler tritt bei "np.asarray(storage)" auf.
BlackJack

@yiiit: Ganzer Fehler meint kompletter Traceback, nicht nur das Ende.
yiiit
User
Beiträge: 10
Registriert: Dienstag 8. Mai 2012, 15:22

Da kommt kein Traceback, der Fehler ist so in die Logging-Ausgaben eingereiht:
2012-06-22 11:49:42 INFO: WorkflowEntity.publishMessage(): Sampling::0 publish message MSG_TYPE_DATA :: FEATURE
2012-06-22 11:49:42 INFO: common.wrapper(): Entering function hough
2012-06-22 11:49:42 INFO: Hough.hough(): Hough: hough
OpenCV Error: Bad argument (unrecognized or unsupported array type) in unknown function, file ..\..\..\OpenCV-2.4.0\modules\core\src\array.cpp, line 967
Und hier sind die Fehler-Dialogboxen:


Bild

Bild
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

yiiit hat geschrieben:aber ich habe nach wie vor Probleme den Code für die lineare Hough-Transformation in den für die zirkulare zu übertragen - das muss doch funktionieren, das Verfahren bleibt ja prinzipiell gleich, lediglich die Gleichung muss angepasst werden.. oder?
Zum Verständnis:
Die Hough-Transformation für Kreise ist eigentlich einfacher als die für Geraden. Die Idee hinter der Hough Transformation ist ja, dass man annimmt, dass der aktuelle Punkt zum Kreis (.../Ellipse/Gerade/Was-auch-immer-immer) gehört und alle Positionen markiert an denen sich der Mittelpunkt dann befinden könnte. Wenn man nun annimmt, dass man einen beliebigen Punkt auf dem Kreis gefunden hat, kann sich der Kreismittelpunkt wiederum in einem Kreis mit dem gesuchten Radius um diesen Punkt befinden. D.h. die Hough-Transformation für Kreise macht nichts anderes, als für jeden Punkt im Bild einen Kreis im Akkumulatorraum mit dem Radius r an der aktuellen Position zu zeichnen. Wenn man nun mehrere Radien suchen will, muss man mehr Dimensionen hinzunehmen.

MFG HerrHagen
Antworten