Matplotlib 基于“a”的等高线;标签面具“;

Matplotlib 基于“a”的等高线;标签面具“;,matplotlib,Matplotlib,我有一些用轮廓算法提取特征的图像(我正在做天体物理源提取)。这种方法产生一个“特征映射”,每个像素都用一个整数“标记”(通常每个映射有1000个独特的特征) 我想将每个单独的特征显示为它自己的轮廓 我可以做到这一点的一个方法是: for ii in range(labelmask.max()): contour(labelmask,levels=[ii-0.5]) 然而,这是非常缓慢的,尤其是对于大型图像。有更好(更快)的方法吗 附言。 一点测试表明,这并不快 根据@tcaswell的

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

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

我可以做到这一点的一个方法是:

for ii in range(labelmask.max()):
    contour(labelmask,levels=[ii-0.5])
然而,这是非常缓慢的,尤其是对于大型图像。有更好(更快)的方法吗

附言。 一点测试表明,这并不快

根据@tcaswell的评论,我需要解释为什么
轮廓(标签,级别=np.unique(级别)+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.

很抱歉回答我自己的问题。。。急躁(和好运)战胜了我

关键是使用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)
会将每个标签的轮廓放置在稍微不同的位置;如果您希望相邻标签之间的轮廓重叠,请将其更改为just
labels==ii

我会尝试将您交给轮廓的图像掩蔽到感兴趣的区域,提取它返回的路径,然后将它们移动到正确的位置。或者在你的面具上使用某种边缘检测。边缘检测有什么帮助?我认为“面具”的形象应该已经尽可能前卫了。。。是否有将锐边转换为可用作等高线的点集的例程?这个问题相关且有用:(描述
查找等高线
并创建我已有的
标签
地图)第二部分是我的想法(旋转轮廓->路径),请参阅。这基本上就是
contour
下面正在做的事情,你可以跳过它所做的一系列辅助工作,在某个时候也能做到这一点。你应该将你对我现在删除的答案的评论内容添加到你原来的问题中。回答你自己的问题完全是很酷的。请记住也接受它。附加说明:如果您希望等高线不偏移,请使用
tracer=matplotlib.\u cntr.cntr(x,y,(labels==ii))
而不是您应该编辑答案以包含该注释,注释是不稳定的。