基于“标签蒙版”的轮廓

时间:2013-03-02 18:12:32

标签: matplotlib

我的图像具有使用轮廓算法提取的特征(我正在进行天体物理源提取)。这种方法产生了一个“特征图”,每个像素都用一个整数“标记”(每个地图通常约有1000个独特的特征)。

我想将每个单独的特征显示为自己的轮廓。

我能做到这一点的一种方法是:

for ii in range(labelmask.max()):
    contour(labelmask,levels=[ii-0.5])

然而,这非常慢,特别是对于大图像。有更好(更快)的方式吗?

P.S。 一点点测试表明skimage's find-contours并不快。

根据@ tcaswell的评论,我需要解释为什么contour(labels, levels=np.unique(levels)+0.5))或类似的东西不起作用:

1. Matplotlib spaces each subsequent contour "inward" by a linewidth to avoid overlapping contour lines.  This is not the behavior desired for a labelmask.
2. The lowest-level contours encompass the highest-level contours
3. As a result of the above, the highest-level contours will be surrounded by a miniature version of whatever colormap you're using and will have extra-thick contours compared to the lowest-level contours.

1 个答案:

答案 0 :(得分:1)

很抱歉回答我自己...不耐烦(和好运)让我变得更好。

关键是使用matplotlib的低级C例程:

I = imshow(data)
E = I.get_extent()
x,y = np.meshgrid(np.linspace(E[0],E[1],labels.shape[1]), np.linspace(E[2],E[3],labels.shape[0]))

for ii in np.unique(labels):
    if ii == 0: continue
    tracer = matplotlib._cntr.Cntr(x,y,labels*(labels==ii))
    T = tracer.trace(0.5)
    contour_xcoords,contour_ycoords = T[0].T
    # to plot them:
    plot(contour_xcoords, contour_ycoords)

请注意labels*(labels==ii)会将每个标签的轮廓放在略有不同的位置;如果您希望相邻标签之间有重叠的轮廓,请将其更改为labels==ii