Python顕微鏡画像解析【基礎編】04_前処理②:照明ムラを補正するシェーディングコレクション

はじめに

前回はフィルタリングによるノイズ除去を学びました。今回は、もう一つの重要な前処理**「シェーディングコレクション(Shading Correction)」**について解説します。

顕微鏡で広範囲を観察すると、視野の中心は明るく、周辺にいくほど暗くなる「照明ムラ」が発生することがよくあります。これは、光源の特性や光学系の問題で起こる避けがたい現象です。この照明ムラを放置すると、場所によって明るさが異なるため、閾値処理(二値化)がうまくいかず、正確な解析の妨げとなります。

シェーディングコレクションは、このやっかいな照明ムラを補正し、画像全体の明るさを均一化するための必須テクニックです。しっかりマスターして、解析の精度をさらに一段階アップさせましょう!

シェーディングコレクションの原理

シェーディングコレクションの考え方は非常にシンプルです。原理は、割り算です。

補正画像 = (元画像 ÷ 背景画像) × 背景画像の平均輝度

ここで言う「背景画像」とは、サンプルを置かずに、照明ムラだけを撮影した画像のことを指します。これはフラットフィールド画像 (Flat Field Image) やブランク画像 (Blank Image) とも呼ばれます。

この計算を行うことで、元画像に含まれる照明ムラの成分を打ち消し、均一な明るさの画像を得ることができるのです。

Pythonによるシェーディングコレクションの実装

それでは、実際にPython(OpenCV)を使ってシェーディングコレクションを実装してみましょう。

1. 準備:元画像とフラットフィールド画像

まず、照明ムラのある「元画像」と、あらかじめ撮影しておいた「フラットフィールド画像」を準備します。

照明ムラのある元画像フラットフィールド画像

見ての通り、どちらも中心が明るく、周辺が暗くなっていますね。このムラのパターンが同じであることが重要です。

2. Pythonコード

以下のコードで、シェーディングコレクションを実行します。

import cv2
import numpy as np

# --- 画像の読み込み ---
# 照明ムラのある元画像
img_shading = cv2.imread(shading_applied.png', cv2.IMREAD_GRAYSCALE)
# フラットフィールド画像
flat_field_img = cv2.imread(flat_field.png', cv2.IMREAD_GRAYSCALE)

# --- データ型を浮動小数点数に変換 ---
# 0-255の整数値のままだと割り算の精度が悪いので、float型に変換します。
img_shading_f = img_shading.astype(np.float32)
flat_field_f = flat_field_img.astype(np.float32)

# --- フラットフィールド画像の正規化 ---
# 0除算を防ぐため、微小な値(1e-6)を足しておきます。
# また、画像の輝度スケールを合わせるため、最大値で割って0-1の範囲に正規化します。
flat_field_normalized = flat_field_f / 255.0

# --- 全体の明るさを合わせるための平均輝度を計算 ---
mean_flat_field = np.mean(flat_field_normalized)

# --- シェーディングコレクションの実行 ---
corrected_img_f = (img_shading_f / (flat_field_normalized + 1e-6)) * mean_flat_field

# --- データ型を元の8bit整数に戻す ---
# 0-255の範囲に収まるようにクリッピング処理を行う
corrected_img = np.clip(corrected_img_f, 0, 255).astype(np.uint8)

# --- 結果の保存 ---
cv2.imwrite(corrected.png', corrected_img)

3. 実行結果

照明ムラのある元画像補正後の画像

どうでしょうか。左の画像にあった中心部の明るさと周辺部の暗さが、右の補正後画像では見事に均一化されているのが分かります。これで、画像上のどこであっても同じ基準で二値化処理などを行えるようになりました。

フラットフィールド画像を撮影する際の注意点

シェーディングコレクションの精度は、いかに綺麗なフラットフィールド画像を撮影できるかにかかっています。以下の点に注意しましょう。

  • 照明条件を絶対に変えない: 元画像を撮影した時と全く同じ明るさ、同じ光学系で撮影する必要があります。
  • ピントを合わせる: 背景にピントを合わせ、ゴミや傷がボケて写るようにします。(もしゴミが写ってしまった場合は、前回のフィルタリングで除去しておきましょう)
  • 十分な明るさで撮影する: 白飛びしない範囲で、なるべく明るく撮影し、画像のS/N比(シグナル対ノイズ比)を高く保ちます。

まとめ

今回は、照明ムラを補正するシェーディングコレクションについて学びました。一見地味な処理ですが、定量的な解析を行う上では欠かすことのできない非常に重要な前処理です。

  • シェーディングコレクションは、元画像を背景(フラットフィールド)画像で割り算することで実現できる。
  • 精度の高い補正には、質の高いフラットフィールド画像が不可欠。

ノイズ除去とシェーディングコレクション、この2つの前処理をマスターすれば、あなたの画像解析は次のステージに進みます。

次回は、周期的なノイズに絶大な効果を発揮する**「FFT(高速フーリエ変換)を用いたノイズ除去」**について解説します。お楽しみに!

コメント