1

Pythonとscipyを使用して、非常に単純なセグメンテーションを実行しようとしています。私がここでやろうとしているのは、(numpy ndarray の) ラベル付けと画像化を行ってから、いくつかのパッチのサイズを計算し、それらの最大のものを削除してから、再度ラベル付けすることです。

ただし、最後ndimage.label( fin )にエラーが発生します

RunTimeError: data type not supported

エラーの原因は何ですか?配列 a と配列 fin はどちらも int32 の同じデータ型です。また、ラベル関数は構造要素をデフォルトにし、定義されていないのと同じタイプに出力する必要があります。これは本当に私を悩ませています。

私が実行している小さなテストコードは次のとおりです。

import numpy as np
from scipy import ndimage

def main():

    a = np.array([  [1, 1, 1, 0, 0, 0],
                [1, 1, 1, 0, 0, 0],
                [1, 0, 0, 0, 1, 0],
                [0, 0, 0, 1, 1, 0],
                [0, 0, 0, 0, 1, 1],
                [1, 0, 0, 0, 1, 0]  ])

    labeled_array, numpatches = ndimage.label(a)

    sizes = ndimage.sum(a,labeled_array,range(1,numpatches+1))

    mp = np.where(sizes == sizes.max())[0]+1 

    max_index = np.zeros(numpatches + 1, np.uint8)
    max_index[mp] = 1
    max_feature = max_index[labeled_array]

    fin = max_feature^a

    lArr, npa = ndimage.label( fin )

    return

main()
4

1 に答える 1

1

ali_m のコメントからこのアイデアを得ました。配列型を強制的にキャストしようと考えたところnp.int64、問題が解決したようです。そもそも配列がデフォルトで np.int32 だった理由はわかりません。

a = np.array([  [1, 1, 1, 0, 0, 0],
            [1, 1, 1, 0, 0, 0],
            [1, 0, 0, 0, 1, 0],
            [0, 0, 0, 1, 1, 0],
            [0, 0, 0, 0, 1, 1],
            [1, 0, 0, 0, 1, 0]  ], np.int64)

とにかく、型を np.int64 にキャストすると、問題が解決したようです。

于 2013-10-09T13:35:46.200 に答える