我有一個遞回深度優先搜索演算法,它采用黑白蒙版影像,例如:
并輸出該掩碼中最大的 x 個白色像素簇,例如(對于 x = 2):
功能如下:
def split_mask_into_x_biggest_clusters(input_mask, x):
def generate_neighbours(point):
neighbours = [
(1, -1), (1, 0), (1, 1),
(0, -1), (0, 1),
(1, -1), (1, 0), (-1, 1)
]
for neigh in neighbours:
yield tuple(map(sum, zip(point, neigh)))
def find_regions(p, points):
reg = []
seen = set()
def dfs(point):
if point not in seen:
seen.add(point)
if point in points:
reg.append(point)
points.remove(point)
for n in generate_neighbours(point):
dfs(n)
dfs(p)
return reg
region = []
data = np.array(input_mask)[:, :, 0]
wpoint = np.where(data == 255)
points = set((x, y) for x, y in zip(*wpoint))
while points:
cur = next(iter(points))
reg = find_regions(cur, points)
region.append(reg.copy())
areas = {idx: area for idx, area in enumerate(map(len, region))}
areas = sorted(areas.items(), key=lambda x: x[1], reverse=True)
num = x
masks = []
for idx, area in enumerate(areas[:num]):
input_mask = np.zeros((512, 512, 3))
for x, y in region[area[0]]:
input_mask[x, y] = [255, 255, 255]
input_mask = input_mask.astype(np.uint8)
masks.append(Image.fromarray(input_mask))
return masks
我的問題是,當我運行它時,我收到以下錯誤:maximum recursion depth exceeded. 在實驗上,我嘗試將遞回限制增加到2000(10000!):
sys.setrecursionlimit(10000)
這有時會解決問題,但并非總是如此(即,當白色像素簇較大時)。
我能做些什么來解決這個問題?感謝您的任何幫助。
uj5u.com熱心網友回復:
對于大影像,您總是會遇到此錯誤。
您可以將實作更改為迭代 DFS(不使用遞回),或使用 BFS。
UPD
可以在這里找到實作(用于迭代 DFS)
BFS 實施
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/526277.html
標籤:Pythonpython-3.x麻木的递归深度优先搜索
上一篇:如何從遞回函式中操作和回傳字串?
