OpenCV

【C++】OpenCVで実践する画像平坦化の基本と応用:EqualizeHistとCLAHEを活用してコントラストを改善する方法

画像の平坦化はC++のOpenCVを利用して画像内の輝度分布を均一化し、コントラスト調整を実現する手法です。

グレースケール画像ではequalizeHist関数で平坦化が可能で、カラー画像の場合には各チャネルの個別処理やCLAHEによる適応手法を利用することができます。

色調への影響を考慮しながら、効果的な画像処理が行える点が魅力です。

平坦化の基本

画像の輝度分布とヒストグラム

画像の各ピクセルが持つ明るさの値は輝度分布として表現され、全体の分布をグラフにしたものがヒストグラムです。

たとえば、暗い部分が多い画像では左側にピークが現れ、明るい部分が強調されている画像では右側にピークが出ます。

ヒストグラムを見ることで画像全体の明暗のバランスがわかります。

ヒストグラム平坦化の目的と効果

ヒストグラム平坦化は、画像内の輝度値の分布を均一にし、コントラストが半自動的に改善される手法です。

これにより暗い場所も明るく、明るすぎる部分も調整され、視覚的に見やすい画像に変化します。

コントラストが不足している画像や、特定の領域に明暗が偏っている画像で効果が期待できます。

平坦化手法の種類

平坦化手法は主に2種類あります。

  • グローバルな平坦化方法として、OpenCVのequalizeHist関数による単純なヒストグラム平坦化
  • 局所的な画像のヒストグラム平坦化として、適応的ヒストグラム平坦化(CLAHE)

両者にはそれぞれの特徴と適用シーンがあり、画像や目的に合わせて選択するのが望ましいです。

OpenCVでの画像平坦化手法

equalizeHist関数による平坦化

グレースケール画像への変換プロセス

カラー画像の場合、まずグレースケール画像に変換してからequalizeHistを適用するケースが一般的です。

変換はcv::cvtColorを利用し、BGRからグレースケールへの変換が行われます。

以下のサンプルコードはその基本的な流れを示しています。

#include <iostream>
#include <opencv2/opencv.hpp>
int main() {
    // 画像の読み込み
    cv::Mat original = cv::imread("input.jpg");
    if(original.empty()){
        std::cerr << "画像の読み込みに失敗しました。" << std::endl;
        return -1;
    }
    // BGR画像からグレースケール画像へ変換
    cv::Mat gray;
    cv::cvtColor(original, gray, cv::COLOR_BGR2GRAY);
    // 変換結果をウィンドウで表示
    cv::imshow("Grayscale Image", gray);
    cv::waitKey(0);
    return 0;
}

Grayscale Image ウィンドウにグレースケール画像が表示されます。

equalizeHistの動作原理

equalizeHistは画像全体の輝度値の分布を均等に広げるアルゴリズムを採用しています。

具体的には、画像のヒストグラムを累積分布関数(CDF)に基づいて変換し、各ピクセルの輝度値が均等に分布するように変換します。

数式で表すと、各輝度値vに対して

v=round((L1)×CDF(v)Total Pixels)

と計算される仕組みです。

平坦化適用時の注意点

equalizeHistはグローバルな処理のため、各部分の局所的な明暗の違いが調整されず、場合によっては細かいディテールが失われたりノイズが強調されたりすることがあります。

また、明るさが既に均一な画像に対しては、効果が薄いという対応が必要になる場合があります。

CLAHEによる適応平坦化

CLAHEの基本原理

CLAHE(Contrast Limited Adaptive Histogram Equalization)は画像全体ではなく、小さな領域ごとに平坦化を行う方法です。

各領域ごとにヒストグラム平坦化することで、局所的なコントラストを強調でき、細部のディテールもより保たれやすくなります。

画像の領域分割を行い、各領域に対するヒストグラム平坦化後に補間処理が適用され、境界部分も自然に接続されるようになります。

ClipLimitとTileGridSizeのパラメータ設定

CLAHEでは「クリップリミット(ClipLimit)」と「タイルグリッドサイズ(TileGridSize)」の2つのパラメータが重要です。

  • ClipLimitは各領域のヒストグラムに対して、どれだけコントラストを制限するかを決定します
  • TileGridSizeは画像をいくつの小領域に分割するかを指定します

この2つのパラメータを調整することで、画像の特性に合わせた最適な平坦化が可能になります。

カラー画像への適用と留意点

カラー画像にCLAHEを適用する場合、一般的には色相(Hue)や彩度(Saturation)の情報を損なわないように、明度(Value)にのみ処理を行うことが推奨されます。

たとえば、Lab色空間に変換して輝度成分だけにCLAHEを適用する方法などが考えられます。

以下のサンプルコードは、グレースケール画像にCLAHEを適用する例です。

#include <iostream>
#include <opencv2/opencv.hpp>

int main() {
    // 画像の読み込み
    cv::Mat original = cv::imread("sample.jpg");
    if (original.empty()) {
        std::cerr << "画像の読み込みに失敗しました。" << std::endl;
        return -1;
    }
    // グレースケールに変換
    cv::Mat gray;
    cv::cvtColor(original, gray, cv::COLOR_BGR2GRAY);
    // CLAHEオブジェクトの作成とパラメータ設定
    cv::Ptr<cv::CLAHE> clahe = cv::createCLAHE();
    clahe->setClipLimit(2.0);
    clahe->setTilesGridSize(cv::Size(8, 8));  // 修正: setTileGridSize -> setTilesGridSize
    // CLAHEを適用して画像のコントラストを改善
    cv::Mat claheResult;
    clahe->apply(gray, claheResult);
    // 処理結果をウィンドウで表示
    cv::imshow("Original Grayscale", gray);
    cv::imshow("CLAHE Result", claheResult);
    cv::waitKey(0);
    return 0;
}

Original Grayscale ウィンドウにグレースケール画像が表示され、CLAHE Result ウィンドウにコントラストが強調された画像が表示されます。

手法の比較と応用事例

equalizeHistとCLAHEの比較

各手法のメリットとデメリット

両手法には以下のような特徴が見られるので、目的に合わせた選択をすることが重要です。

  • equalizeHist

メリット:実装がシンプルで高速に処理が可能

デメリット:グローバルな処理のため、局所的なディテールが失われる可能性がある

  • CLAHE

メリット:局所コントラストを強調でき、細かな情報も保たれる

デメリット:パラメータ調整が必要で、計算コストが高い場合がある

利用シーンごとの適用例

  • 夜間の監視カメラ映像など、暗い領域が多く存在する場合にはequalizeHistが手軽に効果を発揮する
  • 医療画像や細部の解析が求められる分野では、CLAHEがディテールを活かすために利用されることが多い

画像平坦化を活用した実務事例

静止画像での自動補正例

静止画の補正では、撮影環境の影響で生じたコントラスト不足を改善するために各手法が利用されます。

例えば、風景写真や文書画像のコントラスト不足の場合、equalizeHistやCLAHEをシステムに組み込み、ユーザーがすぐに見やすい画像が得られる工夫がされています。

動画像処理への応用考察

動画処理の場合、各フレームに対して自動的に平坦化処理を実施して、全体の明暗バランスを保つケースがあります。

リアルタイム処理では処理速度の面で工夫が求められるため、GPUアクセラレーションなどとの組み合わせも考えられます。

これにより、動作中の映像が均一なコントラストで表示されるようになります。

パラメータ調整とエラー対応

処理結果評価のポイント

輝度分布の確認方法

結果を客観的に確認するためには、処理前後のヒストグラムを比較する方法が有効です。

OpenCVのcalcHist関数などを使って輝度分布を取得し、グラフや表にプロットすることで、どの程度均等化が行われたかを目で確認できます。

コントラスト調整の効果検証

画像の全体的なコントラストが適切に改善されたか検証するために、以下の点に注意するとよいです。

  • 画像内の明暗の差が明確になっているか
  • 細部の情報損失が発生していないか
  • ノイズの増強がないか

ユーザーの視覚検証に加えて、画像の統計情報(平均輝度や標準偏差)を計算することで、定量的な評価も可能です。

エラー処理と例外ケースの検討

入力画像の検証方法

処理を開始する前に、入力画像の存在確認やサイズ、カラーチャネルなどの要素をきちんと検証することが大切です。

画像が見つからなかったり、期待するフォーマットでない場合は、エラーメッセージを出力し、処理を中断するような仕組みを取り入むと安心です。

デバッグ時の留意点

エラー発生時は、読み込みに失敗した画像や意図しない出力結果に着目して、各段階での中間結果を表示するなどのデバッグ出力を活用するとよいです。

また、OpenCVの関数が返すエラーコードや警告メッセージに注意し、問題の原因を絞り込む工夫が求められます。

他のOpenCV画像処理との連携

フィルタ処理との組み合わせ

ぼかし処理後の平坦化適用

画像に対して平坦化処理を行う前に、ノイズ除去やぼかし処理を加えると安定したコントラスト補正が可能になります。

たとえば、ガウシアンフィルタで画像を平滑化してからequalizeHistを適用することで、極端な輝度のギャップが抑止され、より自然な仕上がりになります。

鮮鋭化との組み合わせ効果

平坦化処理によりコントラストが向上した後、鮮鋭化フィルタ(シャープニングフィルタ)を組み合わせると、画像のエッジがはっきりするなど、より見やすい結果が得られます。

こうした連携によって、画像処理パイプライン全体の品質が向上します。

色調補正との統合利用

カラーマッピングとの連動

画像の彩度や色相の調整と平坦化処理を連動させることで、色調の維持や変化をコントロールできるシステムも作成可能です。

Lab色空間への変換とCLAHEの組み合わせにより、明るさのみを対象とした平坦化が実現でき、オリジナルのカラーバランスが保たれます。

ダイナミックレンジ拡張との併用方法

ダイナミックレンジが狭い画像で平坦化処理を適用することで、見えにくかった部分がくっきりするので、HDR(ハイダイナミックレンジ)画像の生成と平坦化処理との組み合わせが注目されています。

数式で示すと、入力画像のピクセル値I(x,y)に対して、ガンマ変換や線形変換を併用する手法が併用例として挙げられます。

まとめ

今回記事で取り上げた各手法は、画像の輝度分布を意識した基本的な平坦化手法から、局所的なコントラスト改善ができるCLAHEまで幅広く紹介しました。

グローバルな平坦化は手軽にコントラストを向上させ、CLAHEは細部のディテールを守りながら明暗のバランスを調整できる点が特徴です。

実際の応用例や他のOpenCV処理との連携にも触れ、現場での利用シーンに応じた設定の工夫が重要なことが理解できる内容となっています。

これらを参考に、ご自身の画像処理プロジェクトに合わせた平坦化技術の導入を検討してみてほしいです。

関連記事

Back to top button
目次へ