Проблема в инструкции if point not in region
, время выполнения которой будет увеличиваться с увеличением размера региона. Сложность, таким образом, квадратична c.
Другая проблема состоит в том, что вы посещаете одни и те же пиксели несколько раз на границе области, поскольку отслеживаете только пиксели в области.
Вы можете избежать этого, используя словарь посещенных пикселей с точкой в качестве ключа.
def region_growing(x, y):
value = image[x,y]
region = [(x,y),]
seeds = [(x,y),]
visited = {(x,y):true}
while seeds:
seed = seeds.pop()
x = seed[0]
y = seed[1]
for i in range(x-1, x+2):
for j in range(y-1, y+2):
point = (i,j)
if point in visited:
continue
visited[point] = true
if image[i,j] == value:
region.append(point)
seeds.append(point)
return region
Другой метод заключается в использовании матрицы логических значений вместо словаря. Это быстрее, но требует больше памяти.