0

ピクセル値が .pgm ファイルに表示される回数に対応する値のヒストグラムを出力しようとしています。値を正しく読み取っていることはわかっています。問題がある場所で値を印刷しようとしたときです。

int pixelHold[product];

    for(long int i = 0; i < product; i++)
    {
        pixelHold[pixels[i]]++;
        //cout << pixels[i] << ' ' << endl;

    }
    for(long int j = 0; j < product; j++)
    {
        cout << pixelHold[j] << ' ';

    }

「製品」は幅 x 高さのピクセル値で、すべての値を格納するために使用しているベクトルのサイズに対応します。「pixelHold」は、ピクセル値に遭遇するたびにインクリメントするために使用している単なる配列です。たとえば、「222」に 3 回遭遇した場合、「222」スロットに対して「3」を出力します。

ただし、問題は、ヒストグラムを印刷すると、一連のゼロが表示され、最後の 100 スロット程度がゴミになることです。for ループのパラメーターを「221」などの小さい数値に変更すると、その時点までの正しいヒストグラムが出力されます。

どんな助けでも大歓迎です!

4

1 に答える 1

1

常に配列を初期化する必要があります。そうしないと、完全に任意の内容、つまりコンパイラが配列を配置することを決定した RAM の内容が含まれます。

また、ヒストグラム テーブルの次元は 256 にする必要があります。これは、グレースケール イメージに含まれる (8 ビット) 色の数です。

次のコードでうまくいくはずです。

const int histogramLevels = 256;
int pixelHold[histogramLevels];

for (int i=0; i<histogramLevels; i++) pixelHold[i] = 0;

for(long int i = 0; i < product; i++)
{
    pixelHold[pixels[i]]++;
    //cout << pixels[i] << ' ' << endl;

}

for (int i=0; i<histogramLevels; i++) {
    cout << pixelHold[j] << ' ';
}
于 2013-09-19T20:20:52.527 に答える