图像处理一个球的python

时间:2012-03-25 19:36:48

标签: python ascii-art

我面临算法问题。事情就是这样:我有一个球的形象,它是通过分析一个阵列来完成的。它几乎是这样的:

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

我如何用算法找到球的中心(近似)?并显示如下内容:

      ....####......
      .##########....
   ...#####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 个答案:

答案 0 :(得分:2)

计算球的质心应该可以解决问题。基本上,它是作为球的一部分的所有像素的坐标的平均值。这整齐地分解,因此您可以分别计算x和y的平均值。这些方面的东西:

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

(我在这里使用xy,因为它们的含义比ij更清晰。调整品味。)

答案 1 :(得分:1)

如果您的图片很大且红色区域相当小,使用 floodfill 算法会有更好的效果。一旦你找到一个红色像素,你开始填充洪水,它的时间成本只是面积大小。

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)