BFS 알고리즘을 사용하여 연결된 컴포넌트 라벨링 알고리즘을 해결 중입니다. 원래 이미지 인 im은 아웃 이미지로 레이블됩니다.BFS를 사용하여 연결된 컴포넌트 라벨링
얼룩이 작을 때이 코드는 작동합니다. 그러나 큰 blob을 갖기 위해 시작점을 변경하면 코드가 최대 재귀 깊이에 도달하거나 세그먼트 오류가 발생합니다. 이러한 문제를 피하는 방법은 무엇입니까?
import cv2
import numpy as np
from collections import deque
import sys
import copy
sys.setrecursionlimit(10000000)
def bfs(queue, im, out, label):
if len(queue) > 0:
pixel = queue.pop()
print pixel
out[pixel] = label
M, N = im.shape
for n in neighbors(pixel, M, N):
if out[n] == 0 and im[n] == im[pixel]:
queue.append(n)
out = bfs(queue, im, out, label)
return out
def neighbors(pixel, M, N):
if pixel[0] == M - 1 and pixel[1] == N - 1:
return [(M-2, N-1), (M-1, N-2)]
elif pixel == (0,0):
return [(0,1),(1,0)]
elif pixel == (M - 1, 0):
return [(M-1, 1), (M-2, 0)]
elif pixel == (0, N - 1):
return [(1, N-1), (0, N-2)]
elif pixel[0] == 0:
return [(1,pixel[1]), (0, pixel[1]-1), (0 ,pixel[1] + 1)]
elif pixel[1] == 0:
return [(pixel[0], 1), (pixel[0]-1, 0), (pixel[0] + 1, 0)]
elif pixel[0] == M - 1:
return [(pixel[0], pixel[1] + 1), (pixel[0] - 1, pixel[1]), (pixel[0], pixel[1] - 1)]
elif pixel[1] == N - 1:
return [(pixel[0] + 1, pixel[1]), (pixel[0], pixel[1] - 1), (pixel[0] - 1, pixel[1])]
else:
return [(pixel[0] + 1, pixel[1]), (pixel[0], pixel[1] + 1),\
(pixel[0] - 1, pixel[1]), (pixel[0], pixel[1] - 1)]
im = cv2.imread('33039.png', cv2.IMREAD_GRAYSCALE)
out = np.zeros(im.shape)
queue = deque()
queue.append((10,10))
out = bfs(queue, im, out, 1)