我面临算法问题。事情就是这样:我有一个球的形象,它是通过分析一个阵列来完成的。它几乎是这样的:
....####......
.##########....
...############.....
.##########....
....####......
我如何用算法找到球的中心(近似)?并显示如下内容:
....####......
.##########....
...#####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)
但我不知道那里......
答案 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
(我在这里使用x
和y
,因为它们的含义比i
和j
更清晰。调整品味。)
答案 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)