
Radiomics超入門:Gray Level Run Length Matrix特徴
概要
Gray Level Run Length Matrix(GLRLM)は [Galloway1975] によって、テクスチャ特徴として導入されました。GLCMと同様に、GLRLMも画像または画像スタック内の離散化されたグレーレベルの分布を評価します。そのため、入力画像は離散化されていることが前提です。ただし、GLCMが隣接するボクセル内のグレーレベルの共起を評価するのに対し、GLRLMはRun Length(線の繋がりの長さ)を評価します。Run Lengthは、方向ベクトル$${m}$$に沿って同じグレーレベルを持つボクセルの線のように連続した繋がりの長さです。GLRLMは、グレーレベル$${i}$$に対して、長さ$${j}$$のRunの数をまとめたマトリクスになります。

(0°方向ベクトルで探索した場合)
別の簡単な例を見ていきましょう。

(b) 探索方向のベクトルが (1,0)のときのGLRLM [0°]
(c) 探索方向のベクトルが (1,1)のときのGLRLM [45°]
(d) 探索方向のベクトルが (0,1)のときのGLRLM [90°]
(e) 探索方向のベクトルが (-1,1)のときのGLRLM [135°]
Addapted from IBSI ref Fig.14
ここで、ある方向ベクトルの時に得られたGLRLMを$${M_m}$$とします。$${M_m}$$は縦軸に$${N_g}$$、横軸に$${N_r}$$なマトリクスです。$${N_g}$$はROI 信号強度マスクのグレーレベル、$${N_r}$$は方向ベクトル$${m}$$で探索した時のRun Lengthのカウントです。よって、GLRLMの行列要素$${r_{ij}}$$は、グレーレベル$${i}$$でRun Length$${j}$$を持つRunの出現回数になります。
そして、$${N_v}$$を ROI 信号強度マスク内のボクセルの総数とし、$${M_m}$$の全要素の総和$${Ns}$$は、$${\sum_{i=1}^{N_g}\sum_{j=1}^{N_r} r_{ij}}$$となります。
周囲和(Marginal sum)も定義されています。
$${r_{i.}}$$は、グレーレベル$${i}$$に対するRun Length$${j}$$に対する周囲和、つまり、$${r_{i.}=\sum_{j=1}^{N_r} r_{ij}}$$です。
同様に、Run Length$${j}$$に対するグレーレベル$${i}$$の周囲和は$${r_{.j}=\sum_{i=1}^{N_g} r_{ij}}$$です。
特徴の集約
GLCMと同じ考え方になります。GLCMの解説を参照ください。
距離による重み付け
GLCMと同じ考え方になります。GLCMの解説を参照ください。マトリクスがGLRLMに変わったのみです。
GLRLM特徴
Short runs emphasis
短いRun Lengthを強調する特徴。
$$
F_{rlm.sre} = \frac {1} {N_s} \displaystyle\sum_{j=1}^{N_r} \frac {r_{.j}}{j^2}
$$
Long runs emphasis
長いRun Lengthを強調する特徴。
$$
F_{rlm.lre} = \frac {1} {N_s} \displaystyle\sum_{j=1}^{N_r} {j^2} r_{.j}
$$
Low gray level run emphasis
Short Runs Emphasisと似た特徴です [Chu1990]。Run Lengthが短いことが強調される代わりに、低いグレーレベルであることが強調されます。
$$
F_{rlm.lgre} = \frac {1} {N_s} \displaystyle\sum_{i=1}^{N_g} \frac {r_{i.}} {i^2}
$$
High gray level run emphasis
Long Runs Emphasisと似た特徴です [Chu1990]。Run Lengthが長いことが強調される代わりに、高いグレーレベルであることが強調されます。
$$
F_{rlm.hgre} = \frac {1} {N_s} \displaystyle\sum_{i=1}^{N_g} {i^2} r_{i.}
$$
Short run low gray level emphasis
この特徴は、Run Lengthが短く、グレーレベルが低いところに位置するGLRLMの左上 1/4 のRunを強調するものです [Dasarathy1991]。
$$
F_{rlm.srlge} = \frac {1} {N_s} \displaystyle\sum_{i=1}^{N_g} \displaystyle\sum_{j=1}^{N_r} \frac {r_{ij}} {i^2j^2}
$$
Short run high gray level emphasis
この特徴はランの長さが短く、グレーレベルが高いところに位置するGLRLMの左下 1/4 のRunを強調するものです [Dasarathy1991]。
$$
F_{rlm.srhge} = \frac {1} {N_s} \displaystyle\sum_{i=1}^{N_g} \displaystyle\sum_{j=1}^{N_r} \frac {i^2r_{ij}} {j^2}
$$
Long run low gray level emphasis
この特徴はRun Lengthが長く、グレーレベルが低いところに位置するGLRLMの右上 1/4 のRunを強調するものです [Dasarathy1991]。
$$
F_{rlm.lrlge} = \frac {1} {N_s} \displaystyle\sum_{i=1}^{N_g} \displaystyle\sum_{j=1}^{N_r} \frac {j^2r_{ij}} {i^2}
$$
Long run high gray level emphasis
この特徴はRun Lengthが長く、グレーレベルが高いところに位置するGLRLMの右下 1/4 のRunを強調するものです [Dasarathy1991]。
$$
F_{rlm.lrhge} = \frac {1} {N_s} \displaystyle\sum_{i=1}^{N_g} \displaystyle\sum_{j=1}^{N_r} i^2j^2r_{ij}
$$
Gray level non-uniformity
この特徴量は、グレーレベルに対する Run の分布を評価するものです。Run がグレーレベルに沿って均等に分布している場合、特徴値は低くなります。
$$
F_{rlm.glnu} = \frac {1} {N_s} \displaystyle\sum_{i=1}^{N_g} r_{i.}^2
$$
Normalised gray level non-uniformity
$${F_{rlm.glnu}}$$を正規化した特徴です。
$$
F_{rlm.glnu.norm} = \frac {1} {N_{s}^2} \displaystyle\sum_{i=1}^{N_g} r_{i.}^2
$$
Run length non-uniformity
この特徴量は、Run Lengthに対するRunの分布を評価する特徴量です。Run が Run Lengthに沿って均等に分布している場合、この特徴の値は低くなります。
$$
F_{rlm.rlnu} = \frac {1} {N_{s}} \displaystyle\sum_{j=1}^{N_r} r_{.j}^2
$$
Normalised run length non-uniformity
$${F_{rlm.rlnu}}$$を正規化した特徴です。
$$
F_{rlm.rlnu.norm} = \frac {1} {N_{s}^2} \displaystyle\sum_{j=1}^{N_r} r_{.j}^2
$$
Run percentage
この特徴は、実際に計測された Run の数と理論上の Run の最大数の割合です。強く直線的な ROI ボリューム、または均一な ROI ボリュームは低い値になります。
$$
F_{rlm.p.perc}=\frac {N_s} {N_v}
$$
この特徴がマージされたGLRLMを用いて計算される場合、$${N_v}$$は、適切な正規化のために、ROI 信号強度マスクのボクセル数とします。
Gray level variance
この特徴は、グレーレベルに対するRunのばらつきを推定する指標です。
$$
F_{rlm.gl.var} = \displaystyle\sum_{i=1}^{N_g} \displaystyle\sum_{j=1}^{N_r} (i-\mu)^2p_{ij}
$$
ここで、グレーレベル$${i}$$かつRun Length $${j}$$の結合確率推定値$${p_{ij}}$$と、$${\mu}$$は次のように計算されます。
$$
P_{ij} = r_{ij}/N_s
$$
$$
\mu = \displaystyle\sum_{i=1}^{N_g} \sum_{j=1}^{N_r} i p_{ij}
$$
Run length variance
この特徴は、Run Lengthに対してRunのばらつきを推定する指標です。
$$
F_{rlm.rl.var} = \displaystyle\sum_{i=1}^{N_g} \sum_{j=1}^{N_r} (j-\mu)^2p_{ij}
$$
ここで、グレーレベル$${i}$$かつRun Length $${j}$$の結合確率推定値$${p_{ij}}$$と、$${\mu}$$は次のように計算されます。
$$
P_{ij} = r_{ij}/N_s
$$
$$
\mu = \displaystyle\sum_{i=1}^{N_g} \displaystyle\sum_{j=1}^{N_r} j p_{ij}
$$
Run entropy
この特徴は [Albregtsen2000] によって提案されました。
$$
F_{rlm.rl.entro} = -\displaystyle\sum_{i=1}^{N_g} \displaystyle\sum_{j=1}^{N_r} p_{ij} \log_2 p_{ij}
$$
ここで、グレーレベル$${i}$$かつRun Length $${j}$$の結合確率推定値$${p_{ij}}$$と、$${\mu}$$は次のように計算されます。
$$
P_{ij} = r_{ij}/N_s
$$
実践
RadiomicsJを用いて、IBSIデジタルファントムからこれらの特徴を計算してみます。
GLRLMを表示する
上記の例を元に、2D をベースにして計算してみます。
// create 2d array
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);
int nBins = 4;// 1 to 4
//init
GLRLMFeatures test =null;
try {
test = new GLRLMFeatures(
imp,
null,
1,
true,
nBins,
null,
null);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// angle new int[] {0,0,1} is ordered by z,y,x (dim2, dim1, dim0)
double[][] mat_0=null;
double[][] mat_45=null;
double[][] mat_90=null;
double[][] mat_135=null;
try {
mat_0 = test.calcGLRLM(Utils.getAngleVectorKey(new int[] { 0, 0, 1 }), new int[] { 0, 0, 1 });
mat_45 = test.calcGLRLM(Utils.getAngleVectorKey(new int[] { 0, 1, 1 }), new int[] { 0, 1, 1 });
mat_90 = test.calcGLRLM(Utils.getAngleVectorKey(new int[] { 0, 1, 0 }), new int[] { 0, 1, 0 });
mat_135 = test.calcGLRLM(Utils.getAngleVectorKey(new int[] { 0, 1, -1 }), new int[] { 0, 1, -1 });
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Check : (x,y,z)(1,0,0) vector →");
System.out.println(test.toString(mat_0));
System.out.println("Check : (x,y,z)(1,1,0) vector ↗");
System.out.println(test.toString(mat_45));
System.out.println("Check : (x,y,z)(0,1,0) vector ↑");
System.out.println(test.toString(mat_90));
System.out.println("Check : (x,y,z)(-1,1,0) vector ↖");
System.out.println(test.toString(mat_135));
//各ベクトルにおけるGLRLM
Check : (x,y,z)(1,0,0) vector →
4.00 0.00 0.00 0.00
3.00 1.00 0.00 0.00
2.00 1.00 0.00 0.00
3.00 0.00 0.00 0.00
Check : (x,y,z)(1,1,0) vector ↗
4.00 0.00 0.00 0.00
3.00 1.00 0.00 0.00
2.00 1.00 0.00 0.00
3.00 0.00 0.00 0.00
Check : (x,y,z)(0,1,0) vector ↑
2.00 1.00 0.00 0.00
2.00 0.00 1.00 0.00
2.00 1.00 0.00 0.00
1.00 1.00 0.00 0.00
Check : (x,y,z)(-1,1,0) vector ↖
4.00 0.00 0.00 0.00
3.00 1.00 0.00 0.00
4.00 0.00 0.00 0.00
3.00 0.00 0.00 0.00
各特徴を計算する
IBSIデジタルファントムから特徴を計算します。RadiomicsJでは、3D averagingで特徴の集約を行うことができます。
ImagePlus ds_pair[] = TestDataLoader.digital_phantom1();
ImagePlus imp = ds_pair[0];
ImagePlus mask = ds_pair[1];
RadiomicsJ.targetLabel = 1;
GLRLMFeatures f = null;
try {
f = new GLRLMFeatures(
imp,
mask,
1,
true,
Utils.getNumOfBinsByMinMaxRange(imp, mask, 1),
null,
null);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(GLRLMFeatureType.ShortRunEmphasis+":"+f.calculate(GLRLMFeatureType.ShortRunEmphasis.id()));//OK
System.out.println(GLRLMFeatureType.LongRunEmphasis+":"+f.calculate(GLRLMFeatureType.LongRunEmphasis.id()));//OK
System.out.println(GLRLMFeatureType.LowGrayLevelRunEmphasis+":"+f.calculate(GLRLMFeatureType.LowGrayLevelRunEmphasis.id()));//OK
System.out.println(GLRLMFeatureType.HighGrayLevelRunEmphasis +":"+f.calculate(GLRLMFeatureType.HighGrayLevelRunEmphasis.id()));//OK
System.out.println(GLRLMFeatureType.ShortRunLowGrayLevelEmphasis+":"+f.calculate(GLRLMFeatureType.ShortRunLowGrayLevelEmphasis.id()));//OK
System.out.println(GLRLMFeatureType.ShortRunHighGrayLevelEmphasis+":"+f.calculate(GLRLMFeatureType.ShortRunHighGrayLevelEmphasis.id()));//OK
System.out.println(GLRLMFeatureType.LongRunLowGrayLevelEmphasis+":"+f.calculate(GLRLMFeatureType.LongRunLowGrayLevelEmphasis.id()));//OK
System.out.println(GLRLMFeatureType.LongRunHighGrayLevelEmphasis+":"+f.calculate(GLRLMFeatureType.LongRunHighGrayLevelEmphasis.id()));//OK
System.out.println(GLRLMFeatureType.GrayLevelNonUniformity+":"+f.calculate(GLRLMFeatureType.GrayLevelNonUniformity.id()));//ok
System.out.println(GLRLMFeatureType.GrayLevelNonUniformityNormalized+":"+f.calculate(GLRLMFeatureType.GrayLevelNonUniformityNormalized.id()));//OK
System.out.println(GLRLMFeatureType.RunLengthNonUniformity+":"+f.calculate(GLRLMFeatureType.RunLengthNonUniformity.id()));//ok
System.out.println(GLRLMFeatureType.RunLengthNonUniformityNormalized+":"+f.calculate(GLRLMFeatureType.RunLengthNonUniformityNormalized.id()));//OK
System.out.println(GLRLMFeatureType.RunPercentage+":"+f.calculate(GLRLMFeatureType.RunPercentage.id()));//ok
System.out.println(GLRLMFeatureType.GrayLevelVariance+":"+f.calculate(GLRLMFeatureType.GrayLevelVariance.id()));//OK
System.out.println(GLRLMFeatureType.RunLengthVariance+":"+f.calculate(GLRLMFeatureType.RunLengthVariance.id()));//OK
System.out.println(GLRLMFeatureType.RunEntropy+":"+f.calculate(GLRLMFeatureType.RunEntropy.id()));//ok
//出力
ShortRunEmphasis:0.7052347295556062
LongRunEmphasis:3.061120905774842
LowGrayLevelRunEmphasis:0.6029798426410304
HighGrayLevelRunEmphasis:9.697624119625273
ShortRunLowGrayLevelEmphasis:0.35158027600601727
ShortRunHighGrayLevelEmphasis:8.539655587028166
LongRunLowGrayLevelEmphasis:2.390967619786772
LongRunHighGrayLevelEmphasis:17.566188661400165
GrayLevelNonUniformity:21.77620074464118
GrayLevelNonUniformityNormalized:0.430175156107442
RunLengthNonUniformity:26.853351397011608
RunLengthNonUniformityNormalized:0.5127708185542873
RunPercentage:0.6798336798336798
GrayLevelVariance:3.464978728384561
RunLengthVariance:0.5735422830251776
RunEntropy:2.4320741335433476
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