2012-03-25 8 views
1

Ich stehe vor einem Problem des Algorithmus. Hier ist die Sache: Ich habe ein Bild von einem Ball, es wurde durch Analyse eines Arrays gemacht. Es ist ziemlich viel so etwas wie diese:Bildverarbeitung Python eines Balls

 ....####...... 
     .##########.... 
    ...############..... 
     .##########.... 
     ....####...... 

Wie kann ich die Mitte der Kugel (approximativly) mit einem Algorithmus gefunden? Und etwas so anzeigen:

 ....####...... 
     .##########.... 
    ...#####0######..... 
     .##########.... 
     ....####...... 

Ich dachte an etwas wie die Breite der längeren Linie von # und die Höhe.

für die Höhe:

k = 0 
for i in range (0, 10) : 
for j in range (0, 20) : 
# if one line contain a # then k = k+1 
center = (k/2) 

aber ich weiß nicht, von dort ..

Antwort

2

des Massenmittelpunkt des Balls Computing sollte es tun. Im Grunde ist es der Durchschnitt der Koordinaten aller Pixel, die Teil des Balls sind. Dies wird sauber zerlegt, so dass Sie den Durchschnitt für x und y getrennt berechnen können. Etwas in diese Richtung:

sum_x = 0 
sum_y = 0 
count = 0 
for x in range(0, 10): 
    for y in range(0, 20): 
    if image[x][y] == '#': 
     sum_x += x 
     sum_y += y 
     count += 1 
centre_x = sum_x/count # this will truncate; round or use float if you want 
centre_y = sum_y/count 

(Ich verwende x und y hier, weil ihre Bedeutung klarer als i und j ist nach Geschmack anpassen..)

+0

sagen sie, ich habe nicht # aber Farben Tupeln und meinen Zustand "#" drucken ‚, dann (Daten [i]) [1] <40 und (Daten [i]) [2] < 40 und (Daten [i]) [0]> 50: '#' drucken? Es ist für die rote Erkennung – Tsunaze

+1

Ich skizziere hier nur den Algorithmus. Sie müssen die Details selbst anpassen, damit sie mit Ihrem Koordinatensystem und den Datentypen übereinstimmen. – Thomas

+0

@Tsunaze durch jedes der Pixel in Ihrem Bild und Durchschnitt der Koordinaten derjenigen, die die Bedingung erfüllen. – katrielalex

1

Wenn Ihr Bild groß ist und die rot Bereich ist eher klein, floodfill Algorithmus wird eine bessere Leistung haben. Sobald Sie ein einzelnes rotes Pixel gefunden haben, beginnen Sie mit der Überschwemmung, es ist Zeit, die proportional zur Ball Fläche Größe ist.

from collections import deque 
def floodfill(x0, y0, is_red): 
    # here is_red is a function to judge if is_red(x, y) 
    que = deque() 
    inque = set() 
    que.append((x0, y0)) 
    D = ((-1, 0), (1, 0), (0, -1), (0, 1)) 
    sumx, sumy = 0, 0 
    cnt = 0 
    while que: 
     x, y = que.popleft() 
     sumx += x 
     sumy += y 
     cnt += 1 
     for dx, dy in D: 
      x1 = x + dx 
      y1 = y + dy 
      if is_red(x1, y1) and (x1, y1) not in inque: 
       que.append((x1, y1)) 
       inque.add((x1, y1)) 
    return sumx/cnt, sumy/cnt 

def find_center(img): 
    size = img.size() 
    def is_red(x, y): 
     # you may change the judge condition by your self 
     return img[x, y] == '#' 
    for x in xrange(size[0]): 
     for y in xrange(size[1]): 
      if is_red(x, y): 
       return floodfill(x, y, is_red)