【C++】OpenCVで実践するヒストグラム平坦化による画像コントラスト向上テクニック
C++とOpenCVを利用したヒストグラム平坦化は、グレースケール画像の輝度分布を均一化しコントラストを向上させる方法です。
cv::equalizeHist
関数により手軽に実行でき、画像全体の細部が際立つ効果が得られるため、視覚的に分かりやすい結果となります。
ヒストグラム平坦化の基本原理
画像の輝度分布の特徴
画像には、各画素が持つ輝度の分布という性質が存在します。
輝度分布は、画像全体にどの程度の明るさがあるかを表現するグラフとなります。
通常、撮影条件や環境光によって、輝度が集中している範囲が異なるため、部分的に暗すぎたり明るすぎたりすることがあります。
これにより、画像の中に隠れてしまうディテールが存在する場合があります。
たとえば、夜景写真では暗い部分の情報がつぶれてしまったり、逆に雪景色では明るい部分が飛んでしまうことがありますので、ヒストグラムの再分布を行うと、見やすい画像に仕上げるために役立ちます。
累積分布関数による変換プロセス
ヒストグラム平坦化は、画像全体の明るさのバランスを改善するために、累積分布関数(Cumulative Distribution Function : CDF)を利用します。
累積分布関数は、元のヒストグラムの各画素値に対して、その画素値以下の全画素の割合を計算する方法です。
これによって、画像内のすべての輝度値が均一に広がるように変換され、視認性が向上します。
数式 の導出
具体的な変換は、以下の数式で表されます。
ここで、
は元の画像の輝度値のインデックスです は輝度値 の画素数です は画像全体の画素数です
この数式は、画素値
変換関数
再マッピングの流れ
再マッピングの流れは以下のとおりです。
- もとの画像から各輝度値の個数
を取得 - 累積分布関数
を計算 - すべての画素に対して新しい輝度値
を割り当てる
この手順により、元のヒストグラムが広がった形に再マッピングされ、見た目のコントラストが向上します。
処理後の画像は、細かい部分の再現性も高くなる傾向にあります。
C++とOpenCVによる平坦化処理の実装
cv::equalizeHist関数の役割
OpenCVでは、グレースケール画像のヒストグラム平坦化を簡単に実現できるように、cv::equalizeHist
関数が用意されています。
この関数は、入力画像から自動的に輝度分布を計算し、累積分布関数を基にピクセル値を再マッピングして、コントラストを改善する変換処理を行います。
コードとして実装する際に、関数内部で各画素の輝度分布が解析され、最終的に全体のバランスがとれるように変換されるため、非常に使いやすい関数です。
グレースケール画像への適用手順
グレースケール画像に対しては、入力画像の前処理から結果の確認まで、シンプルな流れでヒストグラム平坦化が適用できます。
以下は具体的な実装例になります。
入力画像の前処理
画像ファイルは、一般的にグレースケールで読み込む場合、cv::imread
関数の第二引数に cv::IMREAD_GRAYSCALE
を指定して読み込みます。
これにより、色チャネルが1つのシングルチャネル画像として取得され、以降の処理がスムーズに行える状態になります。
出力結果のコントラスト改善ポイント
ヒストグラム平坦化を適用すると、暗い部分が明るく、明るい部分が若干暗くなる場合もあるため、画像全体のバランスに注意が必要です。
再マッピングが適切に行われた場合、以下のポイントが向上することが期待できます。
- 隠れていたディテールの浮上
- 画像全体の明暗バランスの均一化
- 視認性の向上と細部の改善
この処理により、画像の中に埋もれていた情報にアクセスしやすくなり、後の画像解析や視覚的評価がしやすくなります。
以下に、サンプルコードを掲載いたします。
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
// グレースケール画像として input.jpg を読み込みます
cv::Mat src = cv::imread("input.jpg", cv::IMREAD_GRAYSCALE);
if (src.empty()) {
std::cerr << "画像の読み込みに失敗しました。" << std::endl;
return -1;
}
// ヒストグラム平坦化を適用した結果を保存するための変数 dst を用意します
cv::Mat dst;
cv::equalizeHist(src, dst);
// 画像と結果をそれぞれ表示します
cv::imshow("Original Image", src);
cv::imshow("Equalized Image", dst);
// キー入力待ちを行い、表示ウィンドウを終了します
cv::waitKey(0);
return 0;
}

上記サンプルコードでは、画像ファイルをグレースケールで読み込み、cv::equalizeHist
関数で平坦化処理を実行する手順が確認できます。
読み込みエラーの処理や、ウィンドウ表示の設定も含まれており、手順が非常にシンプルになっています。
カラー画像への拡張手法
カラー画像に対してヒストグラム平坦化を実施する場合、RGB各チャンネルに直接処理を適用すると、色のバランスが崩れる場合があります。
そこで、色空間の変換を行う方法が一般的です。
たとえば、RGBからYCrCbへ変換して輝度情報(Yチャンネル)のみを平坦化し、その後RGBに戻す手法がよく採用されます。
色空間の変換理由と選択
画像の色空間変換は、色再現性を維持しつつ、コントラストの改善効果を得るために重要なステップです。
RGB色空間では、赤、緑、青の各チャンネルが密接に関連しているため、直接平坦化すると意図しない色の変化が生じる可能性があります。
一方、YCrCb色空間では、輝度成分(Y)と色差成分(CrとCb)が分離されており、輝度成分にのみヒストグラム平坦化を施すことで、元の色合いを大きく損なうことなくコントラスト改善が可能となります。
RGBとYCrCbの比較検討
以下はRGBとYCrCbの比較点です。
- RGB
- 各チャネルが相互に影響しあうため、独立した平坦化が難しい
- 変換後の色再現性に注意が必要
- YCrCb
- 輝度(Y)と色差(Cr, Cb)を分離できる
- 輝度のみを調整するため、色合いの変化が抑えられる
これらの理由から、カラー画像のヒストグラム平坦化には、YCrCb色空間が推奨されることが多いです。
各チャネルごとの平坦化処理
カラー画像における平坦化の流れは以下のようになります。
- 画像をRGBからYCrCbに変換
- Yチャンネルのみを抽出して、
cv::equalizeHist
を適用 - 平坦化したYチャンネルと元のCr、Cbチャネルを結合
- 再度RGBに変換
この手法により、元の色彩が大きく変わることなく、輝度情報のバランスが改善されるメリットがあります。
色再現性の調整方法
色再現性の調整には、平坦化後の画像と元画像を比較しながら、以下の点に注意して調整を進めると良いです。
- Yチャンネルの変換結果が極端になりすぎないように調整する
- Cr、Cbチャネルには過剰な調整を加えず、できるだけ元の値に近づける
- 複数の検証画像を用いて、色のバランスを比較評価する
適度な調整により、自然な色彩と高いコントラストの両方を実現することができます。
効果検証の視点と応用例
処理前後のヒストグラム比較
ヒストグラム平坦化の効果を実感するためには、処理前後のヒストグラム比較が有用です。
具体的な手順は以下のとおりです。
- 平坦化前の画像のヒストグラムを計算
- 平坦化処理を適用して新たなヒストグラムを取得
- それぞれのヒストグラムをグラフ化して、分布の広がりやピークの位置を比較する
この比較により、輝度値が均等に分布しているか、暗い部分や明るい部分がどの程度補正されたかを、視覚的に確認することが可能になります。
画像コントラストの改善事例
ヒストグラム平坦化を適用することで、以下のような改善効果が期待できます。
- 闇部分のディテールが見やすくなる
- 明るすぎる部分の輝度が抑えられる
- 全体の階調が均一に広がる
定量評価の指標
定量評価には、以下のような指標が利用できます。
- コントラスト比:最高輝度と最低輝度の比率
- 画像の平均輝度や分散値:分布の広がりを数値化
- ヒストグラムのエントロピー:情報量の指標
これらの指標を用いて、平坦化処理がどの程度効果的に画像のコントラストを改善しているかを、数値面からも確認することができます。
ビジュアルチェックのポイント
実際の画像を見る際には、次のポイントに注意すると良いです。
- 影や明るい部分が極端に変わっていないか
- 隠れていた細部が抽出され、全体のバランスが保たれているか
- 色の再現性に異常が見られないか
これらのチェックを行うことで、平坦化処理が意図した通りに機能しているかどうか、視覚的に確認しやすくなります。
平坦化処理における注意点
過度な変換のリスクと回避策
ヒストグラム平坦化は、適切に適用すればコントラストが改善される一方で、過度に変換を行うと画像の持つ情報が失われてしまうリスクも存在します。
たとえば、極端に明るくなったり暗くなったりすることで、自然な階調が崩れてしまうことがあります。
過度な変換を防ぐために、変換後の画像を十分にチェックし、場合によっては局所的な調整を加える手法が推奨されます。
ノイズ影響への対処方法
平坦化処理を行う際、画像内に含まれるノイズが意図しない変換結果として現れることがあります。
特に、均一でない領域に対して強調がかかると、ノイズが目立ってしまう可能性があります。
以下の対策を行うことが有効です。
局所的調整の必要性と手法
局所的な調整には、適応的ヒストグラム平坦化(CLAHE)が効果的です。
CLAHEを用いると、画像全体ではなく小さな領域ごとにヒストグラム平坦化を実施するため、局所的なコントラストを調整しつつ、ノイズの影響を抑えることができます。
CLAHEは、各領域ごとに独自の平坦化を行うため、全体的なバランスを崩さずに改善が期待できる方法です。
パラメータ選定の基準と留意点
処理の効果を最適化するためには、パラメータの選定が重要になります。
特にCLAHEの場合、ヒストグラムのクリップ制限値やタイルサイズなどのパラメータが結果に大きく影響します。
パラメータ選定の際には、次の点に注意するとよいです。
- 対象画像ごとに最適なパラメータが異なるため、複数の値を試して比較する
- クリップ制限値が低すぎると、十分なコントラスト改善が得られなくなる可能性がある
- タイルサイズが大きすぎると、局所的なノイズの影響が強くなる場合がある
適切なパラメータが選定されれば、平坦化処理によるコントラスト改善が効果的に得られるため、試行錯誤による微調整が重要になってきます。
まとめ
今回の記事では、ヒストグラム平坦化の基本的な原理から、C++とOpenCVを用いた実装、さらにはカラー画像へ応用する方法まで、詳細に説明させてもらいました。
画像の持つ本来の輝度分布に注目し、累積分布関数を用いた再マッピングの考え方や、RGBからYCrCbへの変換による色再現性の維持など、さまざまな観点を踏まえてコントラスト改善の方法を紹介しています。
処理の効果検証や注意点についても具体例や指標を交えて説明しているので、実際に画像解析や画像処理に取り組む際の参考にしてくれるとありがたいです。