0

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++にかなり慣れていないので、他のエラーもあるかもしれません。どんな助けでも感謝します。

4

1 に答える 1

3

histたとえば、次のように配列をゼロに初期化するのを忘れています。

int hist[256] = {0};

アップデート:

prob[j] = hist[j]/total;整数除算を行っているため、結果は常に 0 になります (両方の用語はint-s です)。これを回避するには、prob[j] = hist[j]/(double)total;.

コードの 2 番目の部分は、ヒストグラムの 255 個の値のみを使用しています (ただし、256 個のビンがあります)。したがって、次のように 256 に更新します。

double prob[256];
int newValues[256];
double cuml = 0;
for(int j = 0; j< 256; j++)
...
于 2013-11-08T14:23:49.433 に答える