【发布时间】:2014-11-19 00:03:32
【问题描述】:
我正在使用 BFS 算法解决连接组件标记算法。原始图像 im 将被标记为 out image。
当 blob 很小时,此代码有效。但是,当我将起点更改为具有大 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)
【问题讨论】:
标签: python algorithm python-2.7 computer-vision graph-theory