問題は、greycomatrix
に整数の配列を渡す必要があるが、np.nan
(詳細はthis threadを見てみましょう)float
を入力しています。その結果、ROI外のピクセルをNaN
としてエンコードすることはできません。
非方形ROIを処理するためのおおよその回避策は、ROI外のピクセルを0
に設定し、haralick
からmahotasライブラリを使用することです。この関数は、4つの2次元方向および距離パラメータの特定の値に対応する4つの異なるGLCMから抽出された13個のHaralickフィーチャを返します。ドキュメントから
:
ignore_zeros
関数が(背景として)任意のゼロ値 画素を無視有するために使用することができます。要約すると
、あなたはROI外にあるこれらのピクセルをマスクし、haralick
の呼び出しでTrue
にignore_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外のピクセルに予約されています。強度を0
と1
とを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]])