二値化処理の種類と最適な閾値決定 - 大津法から適応的二値化まで
二値化処理の基礎 - 画像を白と黒に分離する意味
二値化 (Thresholding / Binarization) は、グレースケール画像の各ピクセルを閾値 (threshold) と比較し、白 (255) または黒 (0) の 2 値に変換する処理です。画像処理パイプラインの初期段階で頻繁に使用され、後続の輪郭検出、OCR、物体計数などの前処理として不可欠です。
なぜ二値化するのか: 多くの画像解析タスクでは、対象物 (前景) と背景を明確に分離する必要があります。グレースケール画像は 256 階調の情報を持ちますが、「文字か背景か」「細胞か培地か」「欠陥か正常か」といった判定には 2 値で十分です。二値化により情報量を削減し、後続処理を高速かつ堅牢にします。
二値化の数学的定義:
dst(x,y) = maxval if src(x,y) > thresh
dst(x,y) = 0 otherwise
二値化の種類:
- グローバル閾値: 画像全体に単一の閾値を適用。照明が均一な場合に有効。
- 適応的閾値: ピクセルごとに局所的な閾値を計算。照明が不均一な場合に必須。
- 多値閾値: 複数の閾値で 3 値以上に分類。多段階のセグメンテーションに使用。
OpenCV では cv2.threshold() でグローバル閾値、cv2.adaptiveThreshold() で適応的閾値を適用します。閾値の選択が二値化の品質を決定する最も重要な要素であり、本記事ではその決定方法を詳しく解説します。
固定閾値法 - 手動設定とヒストグラム分析
固定閾値法は最もシンプルな二値化手法で、ユーザーが指定した単一の閾値を画像全体に適用します。照明条件が安定し、前景と背景のコントラストが明確な場合に有効です。
閾値の手動決定: ヒストグラムを観察し、前景と背景に対応する 2 つのピーク (双峰性) の谷間に閾値を設定します。例えば、白い紙に黒い文字が印刷された文書画像では、背景 (200-255) と文字 (0-80) の間の 128 付近が適切な閾値になります。
OpenCV での実装:
ret, binary = cv2.threshold(gray, 128, 255, cv2.THRESH_BINARY)
閾値タイプのバリエーション:
THRESH_BINARY: 閾値以上を白、未満を黒THRESH_BINARY_INV: 閾値以上を黒、未満を白 (反転)THRESH_TRUNC: 閾値以上を閾値に切り詰め、未満はそのままTHRESH_TOZERO: 閾値未満を 0 に、以上はそのままTHRESH_TOZERO_INV: 閾値以上を 0 に、未満はそのまま
固定閾値の限界: 照明が不均一な場合 (影、グラデーション照明、ビネッティング)、単一の閾値では前景と背景を正しく分離できません。画像の一部では適切でも、他の部分では前景が消失したり背景がノイズとして残ったりします。この問題を解決するのが適応的二値化です。
前処理による改善: 固定閾値の適用前にガウシアンぼかし (σ=1-3) でノイズを除去し、ヒストグラム平坦化でコントラストを改善すると、閾値の選択が容易になり結果も安定します。
大津の方法 (Otsu's Method) - 自動閾値決定の標準手法
大津の方法 (Otsu's Method、1979 年) は、ヒストグラムの統計的性質に基づいて最適な閾値を自動決定するアルゴリズムです。クラス間分散を最大化する閾値を選択し、前景と背景の分離度を最大にします。画像処理で最も広く使用される自動閾値決定法です。
アルゴリズムの原理: 閾値 t で画像を 2 クラス (C0: ピクセル値 ≤ t、C1: ピクセル値 > t) に分割したとき、クラス間分散 σ²_B(t) = ω0(t) × ω1(t) × (μ0(t) - μ1(t))² を最大化する t を最適閾値とします。ω0, ω1 は各クラスの画素数比率、μ0, μ1 は各クラスの平均輝度です。
計算効率: 全 256 通りの閾値に対してクラス間分散を計算し、最大値を与える閾値を選択します。ヒストグラムの累積和を利用すると O(L) (L: 階調数=256) で計算可能で、画像サイズに依存しない高速な処理です。
OpenCV での実装:
ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
戻り値 ret に自動決定された閾値が格納されます。
大津法の前提条件と限界:
- ヒストグラムが双峰性 (2 つの明確なピーク) を持つ場合に最適
- 前景と背景の面積比が極端に偏ると精度が低下する (1:9 以上)
- ヒストグラムが単峰性の場合、意味のある閾値が得られない
- 照明の不均一性には対応できない (グローバル閾値の限界)
多段階 Otsu: 3 値以上に分類する多段階 Otsu 法も存在し、OpenCV 4.x では cv2.threshold() に直接は実装されていませんが、scikit-image の threshold_multiotsu() で利用可能です。
適応的二値化 - 照明不均一への対処
適応的二値化 (Adaptive Thresholding) は、画像内の各ピクセルに対して局所的な閾値を計算する手法です。照明が不均一な環境 (影、スポットライト、自然光の変動) で撮影された画像に対して、グローバル閾値では不可能な高品質な二値化を実現します。
基本原理: 各ピクセル (x, y) の閾値 T(x, y) を、そのピクセルを中心とする局所領域 (ブロックサイズ B×B) の統計量から計算します。局所的な明暗の変動に追従するため、照明ムラの影響を受けません。
平均値ベース (Mean):
T(x,y) = mean(局所領域) - C
局所領域の平均輝度から定数 C を引いた値を閾値とします。C は通常 5-15 の範囲で、大きいほど前景として判定される範囲が広がります。
ガウシアンベース (Gaussian):
T(x,y) = gaussian_weighted_mean(局所領域) - C
中心ピクセルに近いほど重みが大きいガウシアン加重平均を使用します。平均値ベースよりエッジ付近の精度が高く、文書画像の二値化で標準的に使用されます。
OpenCV での実装:
binary = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, blockSize=11, C=2)
パラメータ調整のガイドライン:
- ブロックサイズ: 奇数で指定。文字サイズの 2-3 倍が目安。小さすぎるとノイズに敏感、大きすぎると照明補正効果が弱まる。
- 定数 C: 正の値で前景を厚く、負の値で薄くする。文書画像では 2-10 が一般的。
Sauvola の方法: 適応的二値化の改良版で、局所的な標準偏差も考慮します。T(x,y) = μ × (1 + k × (σ/R - 1))。コントラストが低い領域での性能が向上し、古い文書や劣化した画像の処理に優れます。
実践的な閾値設計 - 文書画像と産業検査での応用
実務での二値化は単純な閾値適用だけでなく、前処理・後処理を含むパイプライン全体の設計が重要です。代表的な応用分野での実践的なアプローチを紹介します。
文書画像の二値化パイプライン:
- 入力: スキャン画像またはカメラ撮影画像
- 前処理 1: 傾き補正 (Hough 変換またはプロジェクションプロファイル)
- 前処理 2: ガウシアンぼかし (σ=1.0) でスキャンノイズ除去
- 二値化: 適応的二値化 (Gaussian、blockSize=文字高さの 2 倍、C=5)
- 後処理: モルフォロジーオープニング (3x3) で孤立ノイズ除去
この手順で Tesseract OCR の認識精度が未処理比で 15-25% 向上します。
産業検査での二値化: 半導体ウェハーや基板の欠陥検出では、照明を制御できるため固定閾値が有効です。ただし、製品のロット間変動に対応するため、大津法で閾値を自動調整し、許容範囲 (±10) を設けて異常検知する設計が堅牢です。
カラー画像の二値化: RGB 画像を直接二値化する場合、HSV 色空間に変換して特定の色相範囲を抽出する方法が有効です。例えば赤い物体の検出では H: 0-10 または 170-180、S: 100-255、V: 50-255 の範囲でマスクを生成します。cv2.inRange(hsv, lower, upper) で実装します。
動的閾値の設計: 時系列画像 (動画、連続撮影) では、フレーム間で照明条件が変動する場合があります。各フレームで大津法を適用するか、直前 N フレームの閾値の移動平均を使用して急激な変動を抑制します。閾値の変動が ±20 を超えた場合は照明異常としてアラートを出す設計も有効です。
高度な二値化手法と深層学習アプローチ
従来の閾値ベースの二値化を超える高度な手法と、近年の深層学習による二値化アプローチを紹介します。複雑な背景や劣化した画像に対して、従来手法では困難だった高精度な二値化が可能になっています。
Niblack の方法: T(x,y) = μ + k × σ (k=-0.2 が標準)。局所平均と標準偏差を使用し、コントラストに応じた閾値を設定します。背景領域でノイズが多くなる欠点があり、Sauvola 法で改善されました。
Wolf の方法: Sauvola 法の改良で、画像全体の最小輝度を考慮します。極端に暗い領域や低コントラスト領域での性能が向上し、歴史的文書のデジタル化で高い評価を得ています。
Bradley の方法: 積分画像 (Integral Image) を使用して局所平均を O(1) で計算する高速な適応的二値化です。ブロックサイズに依存しない一定時間で計算でき、リアルタイム処理に適しています。
深層学習による二値化: U-Net や DeepLabV3 などのセマンティックセグメンテーションモデルを文書二値化に適用する研究が進んでいます。DIBCO (Document Image Binarization Competition) では、深層学習手法が従来手法を大幅に上回る F-measure (95% 以上) を達成しています。
- 利点: 複雑な背景、透かし、裏写り、シミなどに対して堅牢
- 欠点: 学習データが必要、推論コストが高い (GPU 推奨)
- 実用例: Google の文書スキャンアプリ、Adobe Scan
ハイブリッドアプローチ: 実務では深層学習と従来手法を組み合わせるハイブリッドが効果的です。まず深層学習で大まかなセグメンテーションを行い、境界付近を適応的二値化で精密化する 2 段階処理により、精度と速度の両立が可能です。処理時間は GPU 使用時で 1 ページあたり約 50ms です。