2016-11-20 20 views
1

私は、スーパーピクセルで画像を分割するためにskimageのSLIC実装を使用しています。私はGLCMを使って分類問題のためにこれらのスーパーピクセルから追加の特徴を抽出したいと思っています。これらのスーパーピクセルは長方形ではありません。 MATLABではピクセルをNaNに設定でき、アルゴリズムによって無視されます(link)。これを使用してスーパーピクセルの周囲に枠線を作成し、未使用のピクセルをNaNに設定することができます。Python:非長方形領域のGLCMを取る

skimageのgreycomatrix関数は、MATLABの実装とまったく同じ働きをしません。ピクセルをNaNに設定すると、アサートで関数が失敗し、すべての値が0より大きいかどうかがチェックされます。

正方形以外のROIで使用できるPythonの実装はありますか?

答えて

2

問題は、greycomatrixに整数の配列を渡す必要があるが、np.nan(詳細はthis threadを見てみましょう)floatを入力しています。その結果、ROI外のピクセルをNaNとしてエンコードすることはできません。

非方形ROIを処理するためのおおよその回避策は、ROI外のピクセルを0に設定し、haralickからmahotasライブラリを使用することです。この関数は、4つの2次元方向および距離パラメータの特定の値に対応する4つの異なるGLCMから抽出された13個のHaralickフィーチャを返します。ドキュメントから

ignore_zeros関数が(背景として)任意のゼロ値 画素を無視有するために使用することができます。要約すると

、あなたはROI外にあるこれらのピクセルをマスクし、haralickの呼び出しでTrueignore_zerosを設定する必要があります。そもそも


DEMO

、私たちはいくつかのモックデータを生成してみましょう:

In [213]: import numpy as np 

In [214]: shape = (3, 4) 

In [215]: levels = 8 

In [216]: np.random.seed(2017) 

In [217]: x = np.random.randint(0, levels, size=shape) 

In [218]: x 
Out[218]: 
array([[3, 1, 6, 5], 
     [2, 0, 2, 2], 
     [3, 7, 7, 7]]) 

その後、我々はゼロ強度、このアプローチのように、画像からすべてのゼロを削除する必要がありますレベルはROI外のピクセルに予約されています。強度を01とを1つの強度にマージすると結果が不正確になることを指摘する価値があります。1

In [219]: x[x == 0] = 1 

In [220]: x 
Out[220]: 
array([[3, 1, 6, 5], 
     [2, 1, 2, 2], 
     [3, 7, 7, 7]]) 

次のステップ(このおもちゃの例では、画像の四隅)ROI外部のピクセルのマスクを定義し0にそれらの画素を設定することからなります。

In [221]: non_roi = np.zeros(shape=shape, dtype=np.bool) 

In [222]: non_roi[np.ix_([0, -1], [0, -1])] = True 

In [223]: non_roi 
Out[223]: 
array([[ True, False, False, True], 
     [False, False, False, False], 
     [ True, False, False, True]], dtype=bool) 

In [224]: x[non_roi] = 0 

In [225]: x 
Out[225]: 
array([[0, 1, 6, 0], 
     [2, 1, 2, 2], 
     [0, 7, 7, 0]]) 

現在GLCMの非矩形ROIのからの特徴抽出を行うことができます。

In [226]: import mahotas.features.texture as mht 

In [227]: features = mht.haralick(x, ignore_zeros=True) 

In [228]: features.size 
Out[228]: 52 

In [229]: features.ravel() 
Out[229]: array([ 0.18  , 5.4  , 0.5254833 , ..., 0.81127812, 
     -0.68810414, 0.96300727]) 

共起行列がどのように見えるかをチェックするために有用であり得ます。たとえば、「ピクセルから右へ」のGLCMは、次のようになります。

In [230]: mht.cooccurence(x, 0) 
Out[230]: 
array([[0, 1, 0, ..., 0, 1, 2], 
     [1, 0, 2, ..., 0, 1, 0], 
     [0, 2, 2, ..., 0, 0, 0], 
     ..., 
     [0, 0, 0, ..., 0, 0, 0], 
     [1, 1, 0, ..., 0, 0, 0], 
     [2, 0, 0, ..., 0, 0, 2]]) 
関連する問題