Hallo zusammen,
ich habe folgendes Problem: Ich habe ein Foto, auf dem Kreisförmige Strukturen (unter dem Mikroskop) zu sehen. sind. Diese möchte ich finden und den kleinsten Abstand eines Kreises zum nächsten Kreis berechnen. Mit Hilfe der Hough Transformation und Opencv funktioniert die Circle detection schon passabel. Ich lasse mir auch (insofern das richtig ist) die Koordinaten der Circle Centres in einer Tabelle ausgeben. Nun weiß ich jedoch nicht weiter. Wie verbinde ich die am nahesten zueinander stehenden Kreise und berechne den Abstand zwischen diesen? Ist das überhaupt möglich so wie ich es mir vorstelle?
Hier mein Code
import cv2
import numpy as np
import math
img = cv2.imread('Test2.jpg',0)
img = cv2.medianBlur(img,5)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,20,
param1=20,param2=30,minRadius=0,maxRadius=100)
circles = np.uint16(np.around(circles))
for i in circles[0,:]:
# draw the outer circle
cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
# draw the center of the circle
cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)
cv2.imshow('detected circles',cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()
if circles is not None:
circles = np.round(circles[0, :]).astype("int")
X = circles
print (X)
Vielen Dank und viele Grüße
[Test2.jpg]C:\Users\Fabia\Desktop[/Test2.jpg]
Verbindung benachbarter Circles
Ich habe schon verstanden was du willst. Und ich habe ja auch nicht nach programmieren, sondern nach Papier gefragt. Irgendwie ne Linie ziehen ist aber etwas dünn
Die Formel ist (Px sind Vektoren!)
d = vektorlänge(P1 - P2) - R1 - R2
Achtung, d kann natürlich negativ werden!
Die Formel musst du nur für alle Kreise paarweise ausrechnen.
Die Formel ist (Px sind Vektoren!)
d = vektorlänge(P1 - P2) - R1 - R2
Achtung, d kann natürlich negativ werden!
Die Formel musst du nur für alle Kreise paarweise ausrechnen.
Genau, soweit habe ich das Verstanden, nur weiß ich nicht, wie ich die Koordinaten der Kreiszentren bekomme. Ich habe mit Opencv ja bislang nur die Kreise detektiert, stecke aber hier fest da ich nicht weiß wie ich an die Koordinaten komme...
du machst doch schon das hier
schau doch mal in der Doku zu cv2.circle() was da so an Parametern übergeben wird
kleiner Tipp: (0,255,0) und (0,0,255) sind schon mal RGB Farbwerte, da brauch ich gar nicht nach zu schauen
Code: Alles auswählen
# draw the outer circle
cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
# draw the center of the circle
cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)
kleiner Tipp: (0,255,0) und (0,0,255) sind schon mal RGB Farbwerte, da brauch ich gar nicht nach zu schauen
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
also wie du schon sagst stelle ich mit den RGB Farbwerten die Farben des Zentrums und des Kreises ein. Weitere Parameter sind folgende:
img – Image where the circle is drawn.
center – Center of the circle.
radius – Radius of the circle.
color – Circle color.
thickness – Thickness of the circle outline, if positive. Negative thickness means that a filled circle is to be drawn.
lineType – Type of the circle boundary. See the line() description.
shift – Number of fractional bits in the coordinates of the center and in the radius value.
Ich sehe daraus nicht, wie ich mir die Zentrumskoordinaten ziehen könnte ... möglicherweise durch den shift parameter aber wird dieser verändert, verändert sich ja nur die Anzahl der Pixel im Zentrum oder im "Ring".... ich weiß echt nicht weiter.....
img – Image where the circle is drawn.
center – Center of the circle.
radius – Radius of the circle.
color – Circle color.
thickness – Thickness of the circle outline, if positive. Negative thickness means that a filled circle is to be drawn.
lineType – Type of the circle boundary. See the line() description.
shift – Number of fractional bits in the coordinates of the center and in the radius value.
Ich sehe daraus nicht, wie ich mir die Zentrumskoordinaten ziehen könnte ... möglicherweise durch den shift parameter aber wird dieser verändert, verändert sich ja nur die Anzahl der Pixel im Zentrum oder im "Ring".... ich weiß echt nicht weiter.....
Du hattest geschrieben, Kreisabstände ermitteln zu wollen. Das kannst Du in kartesischen Koordinaten mittels Pythagoras. Der triviale Ansatz ist, die Abstände zu allen anderen Kreisen zu berechnen und, wenn Dich der kleinste Abstand interessiert, davon dann den kleinsten zu nehmen, ggf. abzüglich der Radien. Das kann bei vielen Kreisen lange dauern. Oder man scannt die umgebenden Koordinaten bis zum ersten Treffer ab. Ist aber aufwendiger zu implementieren; insbesondere, wenn die Radien zu berücksichtigen sind.
Ich bewundere die Fähigkeit mancher Leute, die sich hier die Tage melden, ganz aus sich selbst heraus Code zu schreiben, der auf Punkt und Komma Quellen im Netz gleicht. Wie zb https://docs.opencv.org/master/da/d53/t ... rcles.html
Aber Stein und Bein schwören, das ist alles selbst gemacht.
Mir sind das zu viele Zufälle. Da springt mein BS Detektor an.
Aber Stein und Bein schwören, das ist alles selbst gemacht.
Mir sind das zu viele Zufälle. Da springt mein BS Detektor an.