1

私は、ヒストグラム均等化を使用してこの画像からの移動のようなことをしようとしているプロジェクトに取り組んでいます

http://zerocool.is-a-geek.net/wp-content/uploads/2011/12/input-300x200.jpg

「http://zerocool.is-a-geek.net/wp-content/uploads/2011/12/hist_before.png」

この画像に

http://zerocool.is-a-geek.net/wp-content/uploads/2011/12/output-300x200.jpg

「http://zerocool.is-a-geek.net/wp-content/uploads/2011/12/hist_after.png」

しかし、私はそれを理解できないようです。

これは、同じタイプの調整を実装する必要がある私の拡張画像コードです。

public void EnhancedImage (File fileName) {

           double sumc = 0;
            for(int r = 0; r < array.length; r++){
                for(int c = 0; c < array[r].length; c++){ 
                    sumc = r+c;
                    if (sumc <= array[r][c]) {
                     sumc = array[r][c];
                    }
                        newc = Math.round(maxshade * ((double)sumc / pixtot));
                        array[r][c] = (int) (newc);
                        if (array[r][c] > 255) {
                            array[r][c] = 255;
                    }
                }

                }

私が使用したいアルゴリズムは以下のとおりです。ここで、maxShadeは画像の最大シェード(通常は255)です。sumcはc以下の値を持つ画像内のピクセルの総数であり、pixtotはピクセルの総数です。写真の中の:

newc := round(maxShade * ((double)sumc / pixtot))

しかし、私がそれを正しく行ったかどうかはわかりません...現在、私の画像は本当に暗くなります。

どんな助けでもいただければ幸いです!! ありがとう。

また、私のpixtotルーチン:

 pixtot = 0;
           for(int y = 0; y < imageArray.length; y++)
                for(int x = 0; x < imageArray[0].length; x++)
                    pixtot = x+y;
4

1 に答える 1

1

あなたの問題はここにあります:

pixtot = x+y;

+=まず、ではなく、が必要です=。次に、これはピクセルのではなく、ピクセルのインデックスを合計することです。あなたは次のようなものが欲しい

pixtot += imageArray[y][x];

で同じ概念上の誤りを犯しますsumc

編集:

コードには他にもたくさんの問題があります。ダイナミックレンジを拡大する場合は、すべてのピクセル値の最小値と最大値であるandを計算minしてからmax、各ピクセル値をとして計算しますvalue = maxshade * (value - min) / (max - min)0これにより、 ifvalue==minmaxshadeifの結果のピクセル値が得られますvalue==max

ただし、これではヒストグラム均等化は実際には行われません。そのためには、入力ピクセル値のヒストグラムを計算し、そのヒストグラムで分位数を計算して出力値を計算する必要があります。これは簡単なことではありません。

于 2012-09-20T23:37:31.717 に答える