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
Schwerpunkt von freistehenden Objekten
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.
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)
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.
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 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])
