OpenCV 5.0.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 5.0.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
ヒストグラム平坦化

前のチュートリアル: アフィン変換
次のチュートリアル: ヒストグラムの計算

原著者Ana Huamán
互換性OpenCV >= 3.0

目標

このチュートリアルでは以下を学ぶ:

  • 画像ヒストグラムとは何か、そしてなぜ有用なのか
  • OpenCVの関数 cv::equalizeHist を用いて画像のヒストグラムを平坦化する

理論

画像ヒストグラムとは何か?

  • これは画像の強度分布を図示したものである。
  • これは、考慮する各強度値に対するピクセル数を定量化する。

ヒストグラム平坦化とは何か?

  • これは、強度範囲を引き伸ばすために画像のコントラストを改善する手法である(対応する Wikipediaの項目 も参照)。
  • より明確にするために、上の画像から、ピクセルが利用可能な強度範囲の中央付近に集まっているように見えることがわかる。ヒストグラム平坦化が行うのは、この範囲を引き伸ばすことである。下の図を見てほしい。緑の円は密度の低い強度を示している。平坦化を適用すると、中央の図のようなヒストグラムが得られる。結果として得られる画像が右の図に示されている。

どのように動作するか?

  • 平坦化とは、強度値が範囲全体に広がるように、ある分布(与えられたヒストグラム)を別の分布(より広く、より一様な強度値の分布)へマッピングすることを意味する。
  • 平坦化の効果を実現するには、再マッピングは累積分布関数 (cdf) であるべきである(詳細は Learning OpenCV を参照)。ヒストグラム \(H(i)\) について、その累積分布 \(H^{'}(i)\) は次のとおりである:

    \[H^{'}(i) = \sum_{0 \le j < i} H(j)\]

    これを再マッピング関数として使用するには、最大値が255(または画像の強度の最大値)となるように \(H^{'}(i)\) を正規化する必要がある。上の例では、累積関数は次のとおりである:

  • 最後に、単純な再マッピング手順を用いて、平坦化された画像の強度値を得る:

    \[equalized( x, y ) = H^{'}( src(x,y) )\]

コード

  • What does this program do?
    • 画像を読み込む
    • 元画像をグレースケールに変換する
    • OpenCVの関数 cv::equalizeHist を使ってヒストグラムを平坦化する
    • 元画像と平坦化後の画像をウィンドウに表示する。

解説

  • 元画像を読み込む:

  • グレースケールに変換する:

  • 関数 cv::equalizeHist でヒストグラム平坦化を適用する:

    容易に分かるように、引数は元画像と出力(平坦化後)画像だけである。

  • 両方の画像(元画像と平坦化後)を表示する:

  • ユーザーがプログラムを終了するまで待つ

結果

  1. 平坦化の結果をよりよく実感するために、次のようなコントラストの乏しい画像を取り上げてみよう:

ちなみに、この画像のヒストグラムは次のとおりである:

ピクセルがヒストグラムの中央付近に集中していることに注目してほしい。

  1. このプログラムで平坦化を適用すると、次の結果が得られる:

この画像は明らかにコントラストが増している。次のようにして新しいヒストグラムを確認してほしい:

ピクセル数が輝度範囲全体により広く分布していることに注目してほしい。

覚え書き
上で示したヒストグラムの図をどのように描いたか気になるだろうか? 次のチュートリアルを参照してほしい!