0

輪郭アルゴリズムで特徴が抽出された画像があります(天体物理学的なソース抽出を行っています)。このアプローチにより、各ピクセルが整数で「ラベル付け」された「特徴マップ」が生成されます(通常、マップごとに最大1000の固有の特徴)。

個々の特徴をそれぞれの輪郭として示したいと思います。

これを実現する1つの方法は次のとおりです。

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

ただし、これは特に大きな画像の場合は非常に遅くなります。より良い(より速い)方法はありますか?

PS少しテストしたところ、skimageの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.
4

1 に答える 1

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隣接するラベル間で輪郭を重ねる場合にのみ、に変更します。

于 2013-03-02T19:12:28.410 に答える