【发布时间】:2014-10-08 08:06:04
【问题描述】:
我编写了这个 python 代码来获取标签的邻居(一组共享一些共同属性的像素)。标签的邻居被定义为位于边界另一侧的其他标签(相邻标签共享一个边界)。所以,我写的代码可以工作,但速度极慢:
# segments: It is a 2-dimensional numpy array (an image really)
# where segments[x, y] = label_index. So each entry defines the
# label associated with a pixel.
# i: The label whose neighbours we want.
def get_boundaries(segments, i):
neighbors = []
for y in range(1, segments.shape[1]):
for x in range(1, segments.shape[0]):
# Check if current index has the label we want
if segments[x-1, y] == i:
# Check if neighbour in the x direction has
# a different label
if segments[x-1, y] != segments[x, y]:
neighbors.append(segments[x,y])
# Check if neighbour in the y direction has
# a different label
if segments[x, y-1] == i:
if segments[x, y-1] != segments[x, y]:
neighbors.append(segments[x, y])
return np.unique(np.asarray(neighbors))
你可以想象,我在这里可能完全误用了 python。我想知道是否有办法优化此代码以使其更具 Python 风格。
【问题讨论】:
-
当然有一些方法可以让代码更符合 Python 风格,但如果这是您所希望的,那么这样做可能不会对性能产生太大影响
-
你可以将你的 if 语句融合在一起,比如“if segments[x-1, y] == i and segments[x-1, y] != segments[x, y]:” 但是你不能让它更快
-
对于分割和/或标记测量,我建议看一下scipy-lectures.github.io/advanced/image_processing/… 这就是我用来标记图像内的像素之类的东西。 (看看它,如果它符合你的要求,我可以写一个关于它的答案,提供更多细节)
-
你真的只想要每个匹配标签像素右侧和下方的邻居吗?这就是您的代码现在所做的......一般不是“邻居”,而只是特定方向的邻居。
-
@John:是的,只有右/下方向的邻居,这将获得所有连接的邻居。
标签: python optimization numpy