openCV と C++ を使用して HSV 画像のヒストグラムを均等化しようとしています。これを行うopenCVのライブラリがあることは知っていますが、方法を理解するために手動で試してみたいと思います。
HSV 画像の V チャンネルでイコライゼーションが行われると仮定していますか? グレースケール ヒストグラムの均等化の方法を見つけました。
- Count 各値のピクセル数
- 画像内の各ピクセルの確率を求める
- 累積分布関数を計算する
- イメージ内の CDF * 最大値を計算します。
- この数値を四捨五入してピクセル値を取得します
値の単純な 5x5 グリッドを使用して紙でこの方法を試してみましたが、値を均等化する効果があるように見えました。
これを C++ で実装しようとしましたが、期待した値が得られません。
int rows = channel.rows;
int cols = channel.cols;
int hist[256];
int total = rows*cols;
for(int i = 0; i<rows; i++)
{
for(int k = 0; k<cols; k++ )
{
int value = channel.at<cv::Vec3b>(i,k)[0];
hist[value] = hist[value] + 1;
}
}
double prob[255];
int newValues[255];
double cuml = 0;
for(int j = 0; j< 255; j++)
{
prob[j] = hist[j]/total; // Probability of each value in image
cuml = cuml + prob[j]; // Cumulative probability of current and all previous values
double cdfmax = cuml * 255; // Cumulative probability * max value
newValues[j] = (int) round(cdfmax);
cout << hist[j] << endl;
cout << prob[j] << endl;
}
Channel は、HSV 画像の V 値を表す Mat 画像です。問題は、画像内のその値のすべての出現を合計する最初の for ループにあると確信しています。私はC++にかなり慣れていないので、他のエラーもあるかもしれません。どんな助けでも感謝します。