обработка изображений питон шара - PullRequest
1 голос
/ 25 марта 2012

Я столкнулся с проблемой алгоритма.Вот в чем дело: у меня есть изображение шара, это было сделано путем анализа массива.Это примерно так:

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

Как мне найти центр шара (приблизительно) с помощью алгоритма?И отображая что-то вроде этого:

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

Я думал о том, чтобы использовать что-то вроде ширины длинной строки # и высоты.

для высоты:

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)

но я не знаю оттуда ..

Ответы [ 2 ]

2 голосов
/ 25 марта 2012

Вычисление центра масс мяча должно сделать свое дело.По сути, это среднее значение координат всех пикселей, которые являются частью шара.Это аккуратно разлагает, так что вы можете вычислить среднее для х и у отдельно.Что-то в этом роде:

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

(здесь я использую x и y, потому что их значение яснее, чем i и j. Отрегулируйте по вкусу.)

1 голос
/ 26 марта 2012

Если ваше изображение большое, а область red довольно мала, использование алгоритма floodfill будет иметь лучшую производительность. Как только вы найдете один красный пиксель, вы начнете заливку, и его время будет пропорционально размеру ball .

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