6

scikit-image で利用可能な measure.regionprops メソッドを使用して、接続されたコンポーネントのプロパティを測定しています。一連のプロパティを計算します ( Python-regionprops )。ただし、接続された各コンポーネントの面積だけが必要です。単一のプロパティだけを計算して計算を節約する方法はありますか?

4

3 に答える 3

6

regionpropswithを使用して同じことを行うより直接的な方法があるようですcache=Falseskimage.segmentation.slicwithを使用してラベルを生成しましたn_segments=10000。それで:

rps = regionprops(labels, cache=False)
[r.area for r in rps]

regionprops のドキュメントに関する私の理解では、設定cache=Falseとは、属性が呼び出されるまで属性が計算されないことを意味します。Jupyter Notebookによると%%time、上記のコードを実行すると、 で 166ms に対して で 247ms かかったので、動作しcache=Falsecache=Trueいるようです。

他の回答と同等のものを試してみたところ、はるかに遅いことがわかりました。

%%time
ard = np.empty(10000, dtype=int)
for i in range(10000):
   ard[i] = size(np.where(labels==0)[1])

34.3秒かかりました。

skimage宇宙飛行士のサンプル画像とスライス セグメンテーションによって生成されたラベルを使用して、2 つの方法を比較する完全な動作例を次に示します。

import numpy as np
import skimage
from skimage.segmentation import slic
from skimage.data import astronaut

img = astronaut()
# `+ 1` is added to avoid a region with the label of `0`
# zero is considered unlabeled so isn't counted by regionprops
# but would be counted by the other method.
segments = slic(img, n_segments=1000, compactness=10) + 1

# This is just to make it more like the original poster's 
# question.
labels, num = skimage.measure.label(segments, return_num=True)

ラベルがゼロにならないように調整されたインデックス値を使用して、OP の提案された方法を使用して面積を計算します。

%%time
area = {}
for i in range(1,num + 1):
    area[i + 1] = np.size(np.where(labels==i)[1])

CPU times: user 512 ms, sys: 0 ns, total: 512 ms Wall time: 506 ms

regionprops を使用した同じ計算:

%%time
rps = skimage.measure.regionprops(labels, cache=False)
area2 = [r.area for r in rps]

CPU times: user 16.6 ms, sys: 0 ns, total: 16.6 ms Wall time: 16.2 ms

結果が要素ごとにすべて等しいことを確認します。

np.equal(area.values(), area2).all()

True

したがって、ゼロ ラベルとインデックス作成の違いが考慮されている限り、両方の方法で同じ結果が得られますが、キャッシュを使用しない regionprops の方が高速です。

于 2016-03-31T03:46:36.967 に答える
1

接続されたコンポーネントの領域だけが必要な場合に、regionprops を使用せずにすべてのプロパティを計算する方法を見つけました。label コマンドを使用して連結成分のラベル付けを行うと、指定されたラベルのピクセル数を計算することで、各成分のサイズを計算できます。だから基本的に

labels,num=label(image, return_num=True)
for i in range(num):
    area[i]=size(np.where(labels==i)[1])

各連結成分のピクセル数を計算します。

于 2015-03-24T17:14:21.703 に答える