Seite 1 von 1
Hough-Transformation für Kreise
Verfasst: Donnerstag 31. Mai 2012, 13:56
von yiiit
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-
Re: Hough-Transformation für Kreise
Verfasst: Donnerstag 31. Mai 2012, 15:28
von EyDu
Mehr Freiheitsgrade resultieren in mehr Dimensionen.
Re: Hough-Transformation für Kreise
Verfasst: Montag 4. Juni 2012, 12:57
von yiiit
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?
Re: Hough-Transformation für Kreise
Verfasst: Montag 4. Juni 2012, 13:53
von deets
Schau dir doch mal die OpenCV an - die kann das. Da kannst du vielleicht abkupfern.
Re: Hough-Transformation für Kreise
Verfasst: Montag 4. Juni 2012, 14:49
von yiiit
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.. :/
Re: Hough-Transformation für Kreise
Verfasst: Montag 4. Juni 2012, 15:25
von 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.
Re: Hough-Transformation für Kreise
Verfasst: Montag 4. Juni 2012, 15:29
von yiiit
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.
Re: Hough-Transformation für Kreise
Verfasst: Donnerstag 21. Juni 2012, 13:28
von yiiit
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?
Re: Hough-Transformation für Kreise
Verfasst: Donnerstag 21. Juni 2012, 13:33
von EyDu
Kopiere doch bitte die gesamte Fehlermeldung, dann sieht man zumindest die Zeile in der der Fehler auftritt.
Re: Hough-Transformation für Kreise
Verfasst: Donnerstag 21. Juni 2012, 14:09
von yiiit
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.
Re: Hough-Transformation für Kreise
Verfasst: Donnerstag 21. Juni 2012, 19:34
von BlackJack
@yiiit: Ganzer Fehler meint kompletter Traceback, nicht nur das Ende.
Re: Hough-Transformation für Kreise
Verfasst: Freitag 22. Juni 2012, 10:53
von yiiit
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:

Re: Hough-Transformation für Kreise
Verfasst: Freitag 22. Juni 2012, 18:58
von HerrHagen
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