C++とOpenCVでヒストグラム平坦化を適用する方法
ヒストグラムとは、画像における輝度(明るさ)の分布を表すものです。例えば、色深度が8ビットの画像を考えてみましょう。これは各ピクセルが0から255までの値を持つことを意味します。画像がRGB画像であれば、赤・緑・青の3つのチャンネルで構成されています。例えば、画像のある点に赤の成分だけが含まれている場合、その色情報は赤チャンネルに記録され、ピクセルの値は0〜255の間で変化します。0は赤がまったくない状態、255は赤が最も強い状態を表します。
ヒストグラムは、すべてのチャンネル・すべての色についてこのような分布を可視化できます。ピクセルの値を操作することで、特定の色の強度を調整することも可能です。例えば、赤チャンネルの濃さを高めたい場合は、赤チャンネルの値を変更します。
ここでは、まずグレースケール画像に対してヒストグラム平坦化を適用してみましょう。グレースケール画像は黒と白のみで構成されるため、チャンネルは1つだけです。この画像も8ビット画像であり、輝度値は0〜255の範囲を持ちます。OpenCVでは0が黒、255が白を表します。ヒストグラム平坦化を行うと、偏っていた輝度の分布が全体的に引き伸ばされ、画像のコントラストが改善されます。
以下のコードでは、カラー画像を読み込んでグレースケールに変換した後、OpenCVのequalizeHist関数を使ってピクセル値の平坦化を行います。
それでは、OpenCVでヒストグラム平坦化を適用するプログラムを見ていきましょう。
サンプルコード
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
int main() {
Mat original;//行列を宣言//
original = imread("view.jpg");//画像を読み込む
Mat gray;//行列を宣言//
cvtColor(original, gray, COLOR_BGR2GRAY);//グレースケールに変換//
Mat hist;//行列を宣言//
equalizeHist(gray, hist);//ヒストグラム平坦化を適用
namedWindow("Original");//元画像用のウィンドウ//
namedWindow("gray");//グレースケール画像用のウィンドウ//
namedWindow("histogram");//平坦化後の画像用ウィンドウ//
imshow("Original", original);//元画像を表示//
imshow("gray", gray);//グレースケール画像を表示//
imshow("histogram", hist);//平坦化後の画像を表示
waitKey(0);//キー入力を待機//
return(0);
}
実行結果

実行すると、元画像・グレースケール画像・ヒストグラム平坦化を適用した画像の3つのウィンドウが表示されます。平坦化を適用した画像では、暗部と明部のコントラストがはっきりと強調され、ディテールが見やすくなっていることが確認できます。
-
C++とOpenCVで画像のチャンネル数を取得する方法を解説
この記事では、OpenCVを使って画像のチャンネル数を調べる方法について解説します。プログラムを実行すると、コンソール画面に画像のチャンネル数が表示されます。チャンネル数を取得するには、OpenCVが提供するchannels()メソッドを使用します。このメソッドは、Matクラスのオブジェクト(画像行列)に対して呼び出すことで、その画像のチャンネル数を整数値として返します。例えば、カラー画像の場合は通常3チャンネル(BGR)、グレースケール画像の場合は1チャンネルとなります。画像処理を行う際、扱っている画像がカラーかモノクロかを判別するために、チャンネル数の確認は非常に重要な処理の一つです。以下
-
C++とOpenCVで画像を読み込んで表示する方法を徹底解説
この記事では、C++でOpenCVを使用して画像を読み込み、表示する方法について詳しく解説します。OpenCVで画像の読み込みや表示を行うには、以下のような関数やデータ構造が必要になります。 画像処理に必要な基本要素 Mat(マトリクス) Matは関数ではなく、データ構造の一種である変数型です。C++におけるint型やchar型、string型のように、MatはOpenCV独自の変数型であり、画像を格納するための行列(マトリクス)データ構造を作成します。プログラム内で「Mat myImage;」と記述した場合、「myImage」という名前の行列変数を宣言していることになります。 name