Если ваше изображение большое, а область 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)