C++
 Computer >> コンピューター >  >> プログラミング >> C++

OpenCVのequalizeHist()関数とは?画像のコントラストを改善するヒストグラム均等化の使い方

画像のヒストグラムとは

画像のヒストグラムとは、画素の輝度値が出現する頻度を視覚化したものです。画像のヒストグラムでは、横軸(X軸)にグレーレベルの輝度値が、縦軸(Y軸)にそれぞれの輝度値の出現頻度が表示されます。

ヒストグラム均等化(ヒストグラム平坦化)は、輝度値の分布範囲を引き伸ばすことで画像のコントラストを改善する手法です。OpenCVでは、equalizeHist()関数を使うことで、指定した画像のヒストグラムを簡単に均等化できます。

equalizeHist()関数の基本構文

この関数の基本的な構文は以下の通りです。

equalizeHist(入力行列, 出力行列)

グレースケール画像とカラー画像での扱いの違い

この関数は基本的にグレースケール画像を対象としています。グレースケール画像にはチャンネルが1つしか存在しないため、その単一チャンネルの画素値に対して直接均等化処理が適用されます。

一方、カラー画像にこの関数を適用する場合は、入力行列と出力行列を指定する代わりに、画像を複数のチャンネルに分解し、それぞれを個別に処理する必要があります。以下のプログラムでは、カラー画像に対してequalizeHist()関数を適用する手順を紹介します。

サンプルプログラム

次のプログラムは、OpenCVにおけるequalizeHist()関数の具体的な使用例です。この例では、画像をBGR色空間からYCrCb色空間に変換し、輝度成分(Crチャンネル)のみを均等化することで、色相を保ちながらコントラストを向上させています。

コード例

#include<iostream>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
int main(int argc, const char** argv) {
    Mat original;// 行列の宣言//
    original = imread("sky.jpg");// 画像の読み込み//
    vector<Mat> channels;// 各チャンネルを別々の配列に格納するためのベクター//
    Mat hist;// 行列の宣言//
    cvtColor(original, hist, COLOR_BGR2YCrCb);// BGRからYCrCbへ変換//
    split(hist, channels);// チャンネルの分割//
    equalizeHist(channels[2], channels[2]);// 2番目のチャンネルにヒストグラム均等化を適用//
    Mat histeql;// 行列の宣言//
    merge(channels, hist);// 均等化したチャンネルを元の行列と統合//
    cvtColor(hist, histeql, COLOR_YCrCb2BGR);// BGRへ再変換//
    namedWindow("original");// 元画像を表示するウィンドウ//
    namedWindow("hist");// 編集後の画像を表示するウィンドウ//
    imshow("original", original);// 元画像の表示//
    imshow("hist", histeql);// 編集後の画像の表示//
    waitKey(0);// キー入力待ち//
    return 0;
}

実行結果

プログラムを実行すると、元の画像とヒストグラム均等化後の画像が並べて表示され、コントラストの違いを確認できます。

OpenCVのequalizeHist()関数とは?画像のコントラストを改善するヒストグラム均等化の使い方


  1. OpenCVのblur()関数を使って画像をぼかす方法をわかりやすく解説

    この記事では、OpenCVが提供するblur()関数を使用して、画像にぼかし(ブラー)処理をかける方法を解説します。blur()は画像処理の基本となるフィルタの一つで、ノイズ除去や画像の前処理など、さまざまな場面で活用されます。 処理の流れ(アルゴリズム) 画像をぼかすための手順は以下の通りです。 ステップ1:OpenCVをインポートする。 ステップ2:対象となる画像を読み込む。 ステップ3:カーネルサイズを設定する。 ステップ4:blur()関数を呼び出し、画像とカーネルサイズを引数として渡す。 ステップ5:結果を表示する。 元画像 今回使用するサンプル画像は以下の通りです。 サンプルコー

  2. OpenCVのcircle()関数を使って画像に円を描画する方法

    はじめに本記事では、OpenCVが提供するcircle()関数を使用して、画像上に円を描画する方法を解説します。円の中心座標・半径・色・線の太さを自由に指定できるため、画像への注釈付けや図形のオーバーレイ表示など、さまざまな場面で活用できます。元画像処理の手順(アルゴリズム)ステップ1:OpenCVをインポートする ステップ2:円の半径を定義する ステップ3:円の中心座標を定義する ステップ4:円の色を定義する ステップ5:線の太さを定義する ステップ6:上記の引数を画像とともにcv2.circle()へ渡す ステップ7:出力結果を表示するcv2.circle()の主な引数image:描画対象