Schwerpunkt von freistehenden Objekten

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
kl.feigling89
User
Beiträge: 42
Registriert: Montag 24. Februar 2014, 14:47

Hallo, ich habe ein Binärbild und möchte den jeweiligen Schwerpunkt freistehender Objekte ermitteln.
Habe schon die Funktion cv2.moments von openCV entdeckt, leider fehlt mir jedoch eine Beschreibung wie ich damit den Schwerpunkt ermitteln kann.
Eine zweite Frage wäre, kann ich mit dieser Funktion das überhaupt ermitteln ? Oder gibt es eine andere die das kann?
und muss ich das binärbild noch vorher bearbeiten? zb ein labeling ausführen? :K
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

Wenn jedes Pixel die selbe Gewichtung hat musst du nur den den Mittelwert deiner Koordinaten bilden.

Also sagen wir a ist eine Liste mit allen schwarzen Pixeln und enhält die Koordinaten in der Form (x,y) also so a = [(x1, y1), (x2, y2), usw.]
dann wäre der Schwerpunkt deines Objektes bei

x = 1/N * sum_i=0^N x_i
y = 1/N * sum_i=0^N y_i

(N+1 ist die Pixelanzahl)

Das gilt aber nur, wenn die Wichtung gleich ist. Da du hier von binär Daten spricht gehe ich davon aus das 0 = Objekt nicht da und 1 = Objekt da bedeuted, du also keien Information über die Dichte des Objektes an diesem Punkt hast.
kl.feigling89
User
Beiträge: 42
Registriert: Montag 24. Februar 2014, 14:47

Ich habe es jetzt so gelöst, leider bekomme ich zum Beispiel für ein Schwarzes Rechteck mit ein paar weißen stellen mehrere Werte raus. Wie kann ich das rausfiltern?

Code: Alles auswählen

def thresh_callback(image,thresh):
	edges = cv2.Canny(image,thresh,thresh*2)
	contours,hierarchy = cv2.findContours(image,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
	for cnt in contours:
		moments = cv2.moments(cnt) # Calculate moments		
		if moments['m00']!=0:
			cx = int(moments['m10']/moments['m00']) # cx = M10/M00
			cy = int(moments['m01']/moments['m00']) # cy = M01/M00			
			print 'pos:', cy, cx 
			
image = cv2.imread("binaerbild_mit_Rechteck.bmp",-1)
thresh_callback(image,1)
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

Hast du den immer einen Schwerpunkt pro Bild?
Oder musst du aus einem Bild erst die Objekte rausfummeln?

Den hier sieht es für mich jetzt erstmal so aus als ob du dein Bild in mehrere Objekte zerlegst und dann von diesen den Schwerpunkt berechnen willst.
kl.feigling89
User
Beiträge: 42
Registriert: Montag 24. Februar 2014, 14:47

Ja, ich möchte mit Hilfe der Konturen die einzelnen Schwerpunkte der Objekte analysieren.
kl.feigling89
User
Beiträge: 42
Registriert: Montag 24. Februar 2014, 14:47

Code: Alles auswählen


npImg = cv2.imread("tmp.png",0)
moment = cv2.moments(inpImg, True)
if moment['m00']!=0:
	cx = (moment['m10']/moment['m00']) # cx = M10/M00
	cy = (moment['m01']/moment['m00']) # cy = M01/M00			
	print 'Original pos:', cy, cx 
So klappt es für ein Bild, wo nur ein Objekt drin ist.
Ich möchte aber das für jedes Objekt im bild.


Ich glaube ich könnte das Problem lösen, indem ich mit Hilfe der Contouren ein bildausschnit erstelle und dann jeweils den Schwerpunkt mit dieser Methode berechne. Nur wie bekomme ich solch einen Ausschnitt? Weiß nur wie man ein Rechteckigen Ausschnitt erstellt. (crop_image = image[y:x,w:h])
Antworten