1

私はpgmに画像を持っています

ここに画像の説明を入力

この機能を使用した後:

void convertWithDithering(array_type& pixelgray)
{

    int oldpixel;
    int newpixel;
    int quant_error;

    for (int y = 0; y< HEIGHT-1; y++){
        for (int x = 1; x<WIDTH-1; x++){
                oldpixel = pixelgray[x][y];
                 newpixel  = (oldpixel > 128) ? 0 : 1;
                 pixelgray[x][y] = newpixel;
                  quant_error  = oldpixel - newpixel;
                 pixelgray[x+1][y]  =  pixelgray[x+1][y] + 7/16 * quant_error;
                pixelgray[x-1][y+1]  = pixelgray[x-1][y+1] + 3/16 * quant_error;
                pixelgray[x  ][y+1]=pixelgray[x  ][y+1]+  5/16 * quant_error;
                 pixelgray[x+1][y+1] = pixelgray[x+1][y+1]+ 1/16 * quant_error;
        }
    }

}

私はこれを持っています

ここに画像の説明を入力

白黒のみで同じ画像を取得したい

4

2 に答える 2

2

前回、PGM ファイルで同様のスミアリングがあったのは、fopen(filename,"w");

ファイルには多くの\r\n行末 (os: windows) がありましたが、必要なのは\n. 多分あなたの問題はそのようなものです。ファイルをバイナリ形式で保存します。

fopen(filename,"wb");

編集: スミーリングは別として、Floyd-Steinberg ディザリングの実装は正しくありません。

まず、エラーの伝播は(常に 0 に等しい)XXX * quant_error /16の代わりにする必要があります。XXX/16 * quant_error

次に、2 つの色空間 (0/1 と 0->255) を混同しています。これを処理する正しい方法は、テスト行を次のように変更して、常に 0->255 スペースを使用することです。

newpixel = (oldpixel > 128) ? 255 : 0;255 : 0(順序が重要である ことに注意してください。を許可0 : 255すると、アルゴリズムは機能しません)

関数の最後に、配列はいっぱいになるか、0 または 255 になります。必要に応じて、もう一度繰り返して 0-1 に変換できますが、pbm ファイルを記録してからの方が簡単だと思います。 .

于 2013-11-19T12:13:36.797 に答える
0

この関数の外側で PBM への変換が間違っているようです。1 つの PGM ピクセルを複数の PBM ピクセルに変換しているように見えるため、この「汚れ」効果が生じます。勝手な推測だけど。関数自体は、1 つの小さなことを除けば、私には問題ないように見えます。すべてに使用intしているため、すべて 5/16 * quant_errorがゼロになると思います。むしろ float または double を使用して、それを作成し5.0/16.0ます。

于 2013-11-19T11:01:19.743 に答える