見出し画像

Radiomics超入門:Neighboring gray level dependence matrix 特徴

[Sun1983]は、GLCMに代わるテクスチャの指標として、Neighboring gray level dependence matrix(近傍グレーレベル依存行列, NGLDM)を提案しました。NGLDMは、全体的なテクスチャの粗さを捉えることを目的とした指標であり、回転不変です。

計算に用いられるグレーレベルは離散化を前提としています。

NGLDM は、他のテクスチャ特徴と同様に、近傍領域という概念を利用します。チェビシェフ距離$${\delta}$$以内のすべてのボクセルは中心ボクセルの近傍に属するとみなされます。

近傍のボクセルのグレーレベルは、位置$${k}$$における中心ボクセル$${k}$$のグレーレベルと比較され、$${|X_d(k)-X_d(k+m)|≤{ }α }$$であるときに依存性があると判定されます。つまり、差の絶対値が$${\alpha}$$以下のときに計算の対象とします。

近傍内のグレーレベル依存ボクセル$${j}$$の数(グレーレベル依存カウント)は次のように数えられます。

$$
j_k=1+\displaystyle\sum_{m_z=-\delta}^{\delta}\sum_{m_y=-\delta}^{\delta}\sum_{m_x=-\delta}^{\delta}{   }[|X_d(k)-X_d(k+m)|≤{ }α \text{ and }m \not=0]
$$

$${m\not=0}$$というのは、中心ボクセル位置は除くという意味です。
ここで、[...]はアイバーソン・ブラケットであり、条件が満たされていればtrueとなり、そうでなければfalseとなります。

グレーレベル依存数の最小値は$${j_k=1}$$で、$${j_k=0}$$ではありません。これは、特徴定義の中には、依存数の最小値が 1 であることを必要とするもの、あるいは最小値が未定義であるものがあるためです。したがって、最小値を 1 として考慮する場合は、中心ボクセルを含めることで$${ j_k}$$ の式を簡略化することもできます。

$$
j_k=\displaystyle\sum_{m_z=-\delta}^{\delta}\sum_{m_y=-\delta}^{\delta}\sum_{m_x=-\delta}^{\delta}{   }[|X_d(k)-X_d(k+m)|≤{ }α]
$$

グレーレベル依存数 $${j_k}$$ は ROI 信号強度マスク内の各ボクセル $${k}$$に対して繰り返し計算されます。

ここで、$${M}$$は、$${Ng×Nn}$$のNGLDMとします。$${N_g}$$ は ROI 信号強度マスクに存在するグレーレベルの数であり、$${N_n=max(j_k)}$$ は発見された最大のグレーレベル依存数です。

$${M}$$の要素$${s_{ij}}$$は、グレーレベル$${i}$$を有する中心ボクセルに対して依存性があった近傍ボクセルの数$${j}$$の頻度です。さらに、ROI 信号強度マスク内のボクセル数は$${N_v}$$とし、近傍領域の数を$${N_s=\sum^{N_g}_{i=1} \sum^{N_n}_{j=1}s_{ij}}$$とします。

周囲和(Marginal sum)も同様に定義されています。$${s_{i.}=\sum^{N_n}_{j=1}s_{ij}}$$はグレーレベル$${i}$$のときの近傍領域の数、$${s_{j.}=\sum^{N_g}_{i=1}s_{ij}}$$はグレーレベルに関係なく依存性$${j}$$を持つ近傍領域の数です。

2 次元の例を下図に示します。

NGLDMの例
(a) 元画像(離散化済みのグレーレベル)とマスク範囲
(b) NGLDM(縦軸はグレーレベル、横軸は依存ボクセル数)
※依存数カウントであるdependence k ( j 軸) は0から始まっていますが、IBSIの定義に倣えば、1から始まるのが本当です。
Addapted from IBSI ref Fig.19

例えば、グレーレベル「2」に着目した場合、関心領域内には 2 つの「2」があることがわかります。それぞれについて依存度を調べると、一方は、自身の周囲に自分と同じ信号をもつピクセルが 2 つあります。つまり、依存度$${k}$$は「2」、もう一方は、自分と同じ信号をもつピクセルが 3 つあります。したがって、依存度$${k}$$は「3」です。NGLDMは頻度をカウントしますので、結果、グレーレベル「2」を対象としたとき、依存度が 2 であった頻度は 1 回、依存度が 3 であった頻度は 1 回ということになります。

計算例

IBSI が使用している NGLDM の定義は [Sun1983] によるオリジナルから違う点があります。それは、ROIの考え方です。IBSIでは、ROI 信号強度マスク内のすべてのボクセルを中心ボクセルとして繰り返し計算し、その近傍領域はROI 内のみから考慮されます。その結果、$${N_v=N_s}$$となります。ROI 外に位置する近傍ボクセルは$${j}$$に追加されません。

$$
j_k=\displaystyle\sum_{m_z=-\delta}^{\delta}\sum_{m_y=-\delta}^{\delta}\sum_{m_x=-\delta}^{\delta}{   }[|X_d(k)-X_d(k+m)|≤{ }α \text{ and } k+m \text{ in ROI}]
$$

この他、パラメータの閾値である$${α}$$は 0 が典型的に用いられます。異なる$${α}$$も選択可能です。同様に、近傍半径$${δ}$$の典型的な値は、チェビシェフ距離$${δ=1}$$ですが、より大きな値も可能です。

特徴の集約


GLSZMと同様の考え方です。

距離による重みづけ

デフォルトの近傍領域はチェビシェフ・ノルムを用いて定義されますが、他のノルムを用いることもできます。重みづけでは、依存度のカウント式を次のように一般化するのが便利です。

$$
j_k=\displaystyle\sum_{m_z=-\delta}^{\delta}\sum_{m_y=-\delta}^{\delta}\sum_{m_x=-\delta}^{\delta}{   }[\|m\| ≤ \delta \text{ and } |X_d(k)-X_d(k+m)|≤{ }α \text{ and } k+m \text{ in ROI}]
$$

$${m}$$はボクセル$${k}$$と$${m}$$の間のベクトル、$${\|m\|}$$は特定のノルムに従ったベクトルの長さです。さらに、依存度は距離によって重み付けすることもできます。$${w}$$ を $${m}$$ に依存する重みとして、例えば、 $${w=\|m\|^{-1}}$$ または $${w=exp(-\|m\|^2)}$$ とします。このとき、ボクセル$${k}$$の依存度は次のようになります。

$$
j_k=\displaystyle\sum_{m_z=-\delta}^{\delta}\sum_{m_y=-\delta}^{\delta}\sum_{m_x=-\delta}^{\delta}w(m){   }[\|m\| ≤ \delta \text{ and } |X_d(k)-X_d(k+m)|≤{ }α \text{ and } k+m \text{ in ROI}]
$$

ただし、IBSI は重み付けは非推奨です。

NGLDM特徴

NGLDM特徴は、GLRLM特徴をベースにしていますので、特徴の計算方法はこれに倣います。

Low dependence emphasis

低い依存度を強調する特徴。Small Number Emphasis[Sun1983]と呼ばれることもあります。

$$
F_{ngl.lde} = \frac {1} {N_s} \displaystyle\sum_{j=1}^{N_n} \frac {s_{.j}}{j^2}
$$

High dependence emphasis

高い依存度を強調する特徴。Large Number Emphasis[Sun1983]と呼ばれることもあります。

$$
F_{ngl.hde} = \frac {1} {N_s} \displaystyle\sum_{j=1}^{N_n} {j^2} s_{.j}
$$

Low gray level count emphasis

Low Dependence Emphasisと似た特徴です。依存度が低いことが強調される代わりに、低いグレーレベルであることが強調されます。

$$
F_{ngl.lgce} = \frac {1} {N_s} \displaystyle\sum_{i=1}^{N_g} \frac {s_{i.}} {i^2}
$$

High gray level count emphasis

High Dependence Emphasisと似た特徴です。依存度が高いことが強調される代わりに、高いグレーレベルであることが強調されます。

$$
F_{ngl.hgce} = \frac {1} {N_s} \displaystyle\sum_{i=1}^{N_g} {i^2} s_{i.}
$$

Low dependence low gray level emphasis

この特徴は、依存度が低く、グレーレベルが低いところに位置するNGLDMの左上 1/4 の依存度を強調するものです。

$$
F_{ngl.ldlge} = \frac {1} {N_s} \displaystyle\sum_{i=1}^{N_g} \displaystyle\sum_{j=1}^{N_n} \frac {s_{ij}} {i^2j^2}
$$

Low dependence high gray level emphasis

この特徴は依存度が低く、グレーレベルが高いところに位置するNGLDMの左下 1/4 の依存度を強調するものです。

$$
F_{ngl.ldhge} = \frac {1} {N_s} \displaystyle\sum_{i=1}^{N_g} \displaystyle\sum_{j=1}^{N_n} \frac {i^2s_{ij}} {j^2}
$$

High dependence low gray level emphasis

この特徴は依存度が高く、グレーレベルが低いところに位置するNGLDMの右上 1/4 の依存度を強調するものです。

$$
F_{ngl.hdlge} = \frac {1} {N_s} \displaystyle\sum_{i=1}^{N_g} \sum_{j=1}^{N_n} \frac {j^2s_{ij}} {i^2}
$$

High dependence high gray level emphasis

この特徴は依存度が高く、グレーレベルが高いところに位置するNGLDMの右下 1/4 の依存度を強調するものです。

$$
F_{ngl.hdhge} = \frac {1} {N_s} \displaystyle\sum_{i=1}^{N_g} \sum_{j=1}^{N_n} i^2j^2s_{ij}
$$

Gray level non-uniformity

この特徴量は、グレーレベルに対する依存度の分布を評価するものです。依存度がグレーレベルに沿って均等に分布している場合、特徴値は低くなります。

$$
F_{ngl.glnu} = \frac {1} {N_s} \displaystyle\sum_{i=1}^{N_g} s_{i.}^2
$$

Normalised gray level non-uniformity

$${F_{ngl.glnu}}$$を正規化した特徴です。

$$
F_{ngl.glnu.norm} = \frac {1} {N_{s}^2} \displaystyle\sum_{i=1}^{N_g} s_{i.}^2
$$

Normalised gray level non-uniformity が 3D ボリュームから計算された場合、Intensity Histogram の Uniformity特徴と等価になります [VanGriethuysen2017]

Dependence count non-uniformity

この特徴量は、依存度に対する分布を評価する特徴量です。依存度が均等に分布している場合、この特徴の値は低くなります。別名でNumber non-uniformityとも呼ばれます。

$$
F_{ngl.dcnu} = \frac {1} {N_{s}} \displaystyle\sum_{j=1}^{N_n} s_{.j}^2
$$

Normalised dependence count non-uniformity

$${F_{ngl.dcnu}}$$を正規化した特徴です。

$$
F_{ngl.dcnu.norm} = \frac {1} {N_{s}^2} \displaystyle\sum_{j=1}^{N_n} s_{.j}^2
$$

Dependence count percentage

この特徴は、実測された近傍領域の数と理論上ありうる近傍領域の最大数の割合です。この特徴は、IBSI の定義上では、常に 1 となります。

$$
F_{ngl.dc.perc}=\frac {N_s} {N_v}
$$

Gray level variance

この特徴は、グレーレベルに対する依存度のばらつきを推定する指標です。

$$
F_{ngl.gl.var} = \displaystyle\sum_{i=1}^{N_g} \sum_{j=1}^{N_n} (i-\mu)^2p_{ij}
$$

ここで、グレーレベル$${i}$$かつ依存度$${j}$$の確率推定値$${p_{ij}}$$と、$${\mu}$$は次のように計算されます。

$$
P_{ij} = s_{ij}/N_s
$$

$$
\mu = \displaystyle\sum_{i=1}^{N_g} \sum_{j=1}^{N_n} i p_{ij}
$$

Dependence count variance

この特徴は、依存度に対する依存のばらつきを推定する指標です。

$$
F_{ngl.dc.var} = \displaystyle\sum_{i=1}^{N_g} \sum_{j=1}^{N_n} (j-\mu)^2p_{ij}
$$

ここで、グレーレベル$${i}$$かつ依存度$${j}$$の確率推定値$${p_{ij}}$$と、$${\mu}$$は次のように計算されます。

$$
P_{ij} = s_{ij}/N_s
$$

$$
\mu = \displaystyle\sum_{i=1}^{N_g} \sum_{j=1}^{N_n} j p_{ij}
$$

Dependence count entropy

$$
F_{ngl.dc.entro} = -\displaystyle\sum_{i=1}^{N_g} \sum_{j=1}^{N_n} p_{ij} \log_2 p_{ij}
$$

ここで、グレーレベル$${i}$$かつ依存度$${j}$$の確率推定値$${p_{ij}}$$は$${P_{ij} = s_{ij}/N_s}$$です。

Dependence count energy

この特徴はSecond Moment とも呼ばれます。

$$
F_{ngl.dc.energy} = \displaystyle\sum_{i=1}^{N_g} \sum_{j=1}^{N_n} p_{ij}^2
$$

実践

RadiomicsJを使っていきます。

NGLDMの表示

上記の2D の例を使って、NGLDMを計算します。

byte pixels[] = new byte[16];
byte r0[] = new byte[] { 1, 2, 2, 3 };
byte r1[] = new byte[] { 1, 2, 3, 3 };
byte r2[] = new byte[] { 4, 2, 4, 1 };
byte r3[] = new byte[] { 4, 1, 2, 3 };
// flatten to create ByteProcessor
int i= 0;
for(byte[] r: new byte[][] {r0,r1,r2,r3}) {
	for(byte v:r) {
		pixels[i++] = v;
	}
}
ImageProcessor bp = new ByteProcessor(4, 4, pixels);
ImagePlus imp = new ImagePlus("sample", bp);

byte roi_mask[] = new byte[16];
byte m0[] = new byte[] { 0, 0, 0, 0 };
byte m1[] = new byte[] { 0, 1, 1, 0 };
byte m2[] = new byte[] { 0, 1, 1, 0 };
byte m3[] = new byte[] { 0, 0, 0, 0 };
i= 0;
for(byte[] r: new byte[][] {m0,m1,m2,m3}) {
	for(byte v:r) {
		roi_mask[i++] = v;
	}
}
ImageProcessor bp2 = new ByteProcessor(4, 4, roi_mask);
ImagePlus mask = new ImagePlus("sample_mask", bp2);
int alpha = 0;
int delta = 1;

NGLDMFeatures f = null;
try {
	f = new NGLDMFeatures(imp/*descretised*/, mask, RadiomicsJ.targetLabel, alpha, delta);
} catch (Exception e) {
	e.printStackTrace();
}

System.out.println(f.toString());
→ num of dependences
↓ gray level
========================================
	1	2	3	4	
1	0.0	0.0	0.0	0.0	
2	0.0	0.0	1.0	1.0	
3	0.0	0.0	1.0	0.0	
4	1.0	0.0	0.0	0.0	

※図では、列方向のインデックスであるdependencies k (つまり、j)は 0,1,2,3ですが、依存度の最小値は「1」であるため、RadiomicsJの出力は1,2,3,4となっています。

特徴を計算

IBSIデジタルファントムを使って、特徴を計算してみます。

ImagePlus ds_pair[] = TestDataLoader.digital_phantom1();
ImagePlus imp = ds_pair[0];
ImagePlus mask = ds_pair[1];
		
RadiomicsJ.targetLabel = 1;
int nBins = Utils.getNumOfBinsByMinMaxRange(imp, mask, RadiomicsJ.targetLabel);
		
int alpha = 0;
int delta = 1;
		
//ImagePlus img, ImagePlus mask, int label, Integer alpha, Integer delta, boolean useBinCount, Integer nBins, Double binWidth
NGLDMFeatures f = new NGLDMFeatures(imp, mask ,RadiomicsJ.targetLabel, alpha, delta, true, nBins, null);
System.out.println(f.toString());
		
System.out.println(NGLDMFeatureType.LowDependenceEmphasis+":"+f.calculate(NGLDMFeatureType.LowDependenceEmphasis.id()));//OK
System.out.println(NGLDMFeatureType.HighDependenceEmphasis+":"+f.calculate(NGLDMFeatureType.HighDependenceEmphasis.id()));//OK
System.out.println(NGLDMFeatureType.LowGrayLevelCountEmphasis+":"+f.calculate(NGLDMFeatureType.LowGrayLevelCountEmphasis.id()));//OK
System.out.println(NGLDMFeatureType.HighGrayLevelCountEmphasis+":"+f.calculate(NGLDMFeatureType.HighGrayLevelCountEmphasis.id()));//OK
System.out.println(NGLDMFeatureType.LowDependenceLowGrayLevelEmphasis+":"+f.calculate(NGLDMFeatureType.LowDependenceLowGrayLevelEmphasis.id()));//ok
System.out.println(NGLDMFeatureType.LowDependenceHighGrayLevelEmphasis+":"+f.calculate(NGLDMFeatureType.LowDependenceHighGrayLevelEmphasis.id()));//ok
System.out.println(NGLDMFeatureType.HighDependenceLowGrayLevelEmphasis+":"+f.calculate(NGLDMFeatureType.HighDependenceLowGrayLevelEmphasis.id()));//ok
System.out.println(NGLDMFeatureType.HighDependenceHighGrayLevelEmphasis+":"+f.calculate(NGLDMFeatureType.HighDependenceHighGrayLevelEmphasis.id()));//ok
System.out.println(NGLDMFeatureType.GrayLevelNonUniformity+":"+f.calculate(NGLDMFeatureType.GrayLevelNonUniformity.id()));//ok
System.out.println(NGLDMFeatureType.GrayLevelNonUniformityNormalized+":"+f.calculate(NGLDMFeatureType.GrayLevelNonUniformityNormalized.id()));//ok
System.out.println(NGLDMFeatureType.DependenceCountNonUniformity+":"+f.calculate(NGLDMFeatureType.DependenceCountNonUniformity.id()));//ok
System.out.println(NGLDMFeatureType.DependenceCountNonUniformityNormalized+":"+f.calculate(NGLDMFeatureType.DependenceCountNonUniformityNormalized.id()));//ok
System.out.println(NGLDMFeatureType.DependenceCountPercentage+":"+f.calculate(NGLDMFeatureType.DependenceCountPercentage.id()));//ok
System.out.println(NGLDMFeatureType.GrayLevelVariance+":"+f.calculate(NGLDMFeatureType.GrayLevelVariance.id()));//ok
System.out.println(NGLDMFeatureType.DependenceCountVariance+":"+f.calculate(NGLDMFeatureType.DependenceCountVariance.id()));//ok
System.out.println(NGLDMFeatureType.DependenceCountEntropy+":"+f.calculate(NGLDMFeatureType.DependenceCountEntropy.id()));//ok
System.out.println(NGLDMFeatureType.DependenceCountEnergy+":"+f.calculate(NGLDMFeatureType.DependenceCountEnergy.id()));//ok
		
→ num of dependences
↓ gray level
========================================
	1	2	3	4	5	6	7	8	9	10	11	12	13	14	15	16	17	18	19	20	21	
1	0.0	0.0	0.0	0.0	2.0	2.0	1.0	6.0	4.0	6.0	5.0	5.0	3.0	2.0	5.0	3.0	3.0	2.0	0.0	0.0	1.0	
2	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	
3	1.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	
4	0.0	2.0	0.0	2.0	6.0	4.0	2.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	
5	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	
6	0.0	1.0	4.0	1.0	1.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	

LowDependenceEmphasis:0.04499635705963142
HighDependenceEmphasis:109.0
LowGrayLevelCountEmphasis:0.6933183183183184
HighGrayLevelCountEmphasis:7.662162162162162
LowDependenceLowGrayLevelEmphasis:0.00963060759417958
LowDependenceHighGrayLevelEmphasis:0.7361715884134342
HighDependenceLowGrayLevelEmphasis:102.45082582582583
HighDependenceHighGrayLevelEmphasis:234.98648648648648
GrayLevelNonUniformity:37.91891891891892
GrayLevelNonUniformityNormalized:0.512417823228634
DependenceCountNonUniformity:4.864864864864865
DependenceCountNonUniformityNormalized:0.06574141709276844
DependenceCountPercentage:1.0
GrayLevelVariance:3.0454711468224986
DependenceCountVariance:22.056975894813732
DependenceCountEntropy:4.403738379915685
DependenceCountEnergy:0.05332359386413442

RadiomicsJの引用はこちら

Kobayashi, T. RadiomicsJ: a library to compute radiomic features. Radiol Phys Technol 15, 255–263 (2022). https://doi.org/10.1007/s12194-022-00664-4

RadiomicsJのリンク

https://github.com/tatsunidas/RadiomicsJ


Stay visionary

この記事が気に入ったらサポートをしてみませんか?