📝

[Groovy][QuPath] 章3 QuPath入門2 ~ピクセル分類~

2023/03/14に公開約7,200字

※ 画像解析ソフトQuPathに関する本を執筆中。完成した章から公開していく。

QuPathソフトウェアの中でマウス操作で行える解析を紹介する。

ピクセル分類

特定の色の輝度値などを指標にして各pixelを2値分類する。
背景と組織を分けたり、DABの陽性面積を出すのに有用である。

Classify > Pixel classificationのうち、Create thresholdを選択する。

なお、Train pixel classificationでは機械学習により複数種類のclassに分類できるが、本書では扱わない。十分な精度を出すにはコツが要るのと、処理が重たい。機械学習といってもdeep neural networkのものにはとても及ばない精度。

背景と組織を分ける。

slide scaner dataを使うとスライド全体を解析できるが、勿論データサイズは大きく解析は重たい。
せめて組織領域だけに解析を限定したいので、まずは組織検出を行う。

使用データ) OpenSlide Test data/Aperio/CMU-1

今回の例を順を追って説明する。

1. 閾値設定

組織が無いガラスの領域は組織の領域より明るい輝度を持つので、Threshold以下をRegion* のAnnotation、Threshold以上をUnclassifiedに指定する。
ChannelはRGBの平均を指定した。
(どのchannelで閾値を設定するか、Annotationのclassはどれを使うかは必要に応じて変更してほしい。)

Create threshold設定画面 2値化結果はリアルタイムで反映される

2. 平滑化処理

十分に組織検出できているが、スライド上の細かいゴミも解析エリアになっている。
この次のstepでサイズ閾値を作ることができるので、この段階では拘らなくても良いが、改善したい場合はSmoothing sigmaの値を上げて、平滑化する。

Smoothing sigmaを1に

小さいゴミや組織内の穴も埋まっている。

3. 条件保存

良い条件が見つかれば、Classifier nameの欄に適当な名前を入れてSaveしておく。

保存した条件は次回以降、Load pixel classifierで呼び出せる。
Create thresholderウィンドウ右下の:マークからEnable buttons for unsaved classifiersを選択すると、保存せずに次のステップに進むこともできる。

4. Annotation作成

次に、Create objectsを選択すると、ピクセル分類を実行する対象が聞かれるので、今回は画像全体のFull imageでOKを押す。

次のCreate objectsウィンドウで、最小のobject sizeや最小のhole sizeの閾値を設定できる。

その他、メニューは以下に示す。

  • Split objects: 繋がっていない組織を個別のAnnotationとするかどうか。
  • Delete existing objects: 既に存在するAnnotationを削除するかどうか。
  • Create objects for ignored classes: RegionやIgnoreのようにclass名の最後に*が付いているものはignored classとしてのパラメーターを持つ。これらclassに対してAnnotationを作成するかどうか。
  • Set new objects to selected: 作成したAnnotationを選択状態にするかどうか。

今回は以下のようなsize閾値でAnnotationを作成した。

5. Annotationの追加フィルタリング

size閾値は実際にAnnotationを作ってみないと結果が分からない。上記の例でもまだ小さいゴミや影にAnnotationが作られている。

追加でsize filteringを行うには、上部メニューからObjects > Annotations > Remove fragments & holesを実行する。

閾値の設定 適応対象の選択

これで大きな組織のみにRegion* Annotationを作成することができる。

薄い組織の検出例

使用データ) OpenSlide Test data/Aperio/CMU-2
組織中に脂肪組織が含まれている例である。



上記で作成した組織検出条件をClassify > Pixel classification > Load pixel classifierから呼び出してみる。

色が濃い領域は認識しているが脂肪組織は検出できていない。

ここでは、脂肪組織を含めてAnnotationを作成することを目標に進める。

1. Resolution 解像度を上げる。

画像の輝度を計算する際、最も解像度を上げれば1ピクセルレベルで2値化することができるが、解像度を下げることによって複数ピクセルの平均値の輝度値を使用している。
脂肪組織のように細い基質と背景で構成されている領域は低解像度だと、近傍背景の輝度値に引っ張られてしまう。
薄いor細いような組織の場合は、解像度を上げることで組織認識精度は向上する。

Resolution: Moderate

解像度を上げることで脂肪組織の細い繊維まで認識されている。

ただし、巨大なslide scanner dataの場合は、元の解像度 (40倍対物レンズで0.2 µm/px程度)を指定するのは避けた方が良い。処理が重すぎてフリーズする。

GaussianSmoothing sigmaを上げると、隣り合うピクセルの輝度値の変化を滑らかにするので、低解像度処理と類似した結果になる。

2. Prefilter フィルター処理

少々のholeであればfill hole機能により穴埋めすることができるが、holeとして認識させるためには組織が閉じていないといけない。
例えば以下のような箇所は穴埋めができない。

QuPathでは複数のPrefilterが用意されている。

自身のデータにどれが合うか試してみると良いだろう。

今回の例ではMorphological openingの値を上げることが最適であると判断した。

H-DABの画像もDAB陰性のエリアは薄い輝度なので同様のアプローチが有効である。

なお画像のerode, dilate, close, open処理の一般論については他で十分に解説されているのでここでは省略する。

陽性エリア解析

免疫染色等で細胞外領域の抗原を染色した場合にも、その陽性面積や陽性面積比率を解析にQuPathは有用である。

使用データ) OpenSlide Test data/Hamamatsu/OS-3 拡大図

解析対象用Annotationの作成

陽性エリアを検出する場合、スライド全体ではなく対象領域に対して実施することになるだろう。
高解像度での判別といった重たい動作を行うためにも解析エリアは限定した方がよい。

この例ではスライド上の組織全体を解析対象にする。
以下の条件でRegion*クラスのAnnotationを作成した。

閾値設定 Annotation作成条件

DAB陽性ピクセルの検出

特定の色の検出でもClassify > Pixel classification > Create thresholdから行う。
この例では以下の流れでパラメーターを決定した。

  1. Channelの箇所からDABを選択する。
  2. Above thresholdをPositive, Below thresholdをNegativeに設定。
    (クラスの決め方は任意である。閾値以下をUnclassifiedにしてもよい。)
  3. Thresholdの調整。数値を変えるたびにリアルタイムに結果が反映されるので見た目で決める。
    DABの輝度値は、RGB値の範囲 (0-255)とはスケール感が異なる。わからない場合は、View > Brightness & contrastから特定の色にチェックを入れて値の範囲を見てみるとよいだろう。
  4. Resolutionを上げる。
    最高解像度で判別したいところだが、妥協できる程度まで解像度は低く保つ方が現実的である。
  5. GaussianフィルターのSmoothing sigmaを上げてノイズを抑える。
閾値設定 パラメーター調整中の画面

ちなみに上部のスライドバーで塗りつぶしの透過度が調整できる。

Measureを押すと、Annotationを作る対象が選べるので、All annotationsもしくは選択中のAnnotationにのみ行うならCurrent selectionを選択する。
Measurement nameは任意に変更してよい。

計測終了後、解析対象のAnnotationを選択すると左下のMeasurementsタブからピクセル分類結果が確認できる。実寸のμm^2や解析対象Annotation中の陽性割合が保存されている。

解析終了後 計測結果

結果の書き出し

Annotationの計測結果を書き出すには、Measure > Show annotation measurementsを押す。

1つの画像データ内にある全Annotationの計測結果が集計される。

Copy to clipboardSaveで数値データをテキスト形式で保存できる。

Discussion

ログインするとコメントできます