Verbindung benachbarter Circles

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
F_Wink
User
Beiträge: 11
Registriert: Sonntag 15. September 2019, 09:40

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]
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wie würdest du das denn mit Stift und Papier machen? Gegeben 2 Kreise durch Mittelpunkt P1, P2 und Radius R1, R2, wie groß ist der geringste Abstand zwischen den beiden?
F_Wink
User
Beiträge: 11
Registriert: Sonntag 15. September 2019, 09:40

Ich würde eine Linie ziehen und die länge messen. Nur weiß ich nicht wie man dies Programmiert.
F_Wink
User
Beiträge: 11
Registriert: Sonntag 15. September 2019, 09:40

mit kleinstem abstand meine ich, dass auf dem Bild viele Kreise zu sehen sind, ich aber nur den Abstand zwischen den Kreisen haben möchte die jeweils am nahesten zueinander sind
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
F_Wink
User
Beiträge: 11
Registriert: Sonntag 15. September 2019, 09:40

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...
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

du machst doch schon das hier

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)
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
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_Wink
User
Beiträge: 11
Registriert: Sonntag 15. September 2019, 09:40

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.....
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du schreibst “Center of the Circle” aber weißt nicht wo das Zentrum herkommt?
F_Wink
User
Beiträge: 11
Registriert: Sonntag 15. September 2019, 09:40

Wenn es so trivial ist verraten sie es mir.

Und ich möchte ja quasi einfach nur die Koordinaten des centers haben.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@F_Wink: Ohne Kenntnis der Library wäre jetzt meine erste Idee nachzuschauen, was denn in 'center' steht. Tu das mal.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

center – Center of the circle.

Das. Ist. Der. Kreis. Mittelpunkt.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Oder anders gesagt: i[0],i[1],i[2] sind x, y, r.

Kann es sein, das der Code nicht selbst geschrieben ist?
F_Wink
User
Beiträge: 11
Registriert: Sonntag 15. September 2019, 09:40

Das ist mir alles schon kla und doch der code ist selbst geschrieben aber dennoch erschließt sich mir nicht wie ich die centres nun verbinden kann
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

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.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Antworten