0

以下に示すように、マトリックスを使用してグレースケールし、フォローループで R + G + B 色を 3 で割るための画像フィルターに取り組んでいます。

for (int i = 0; i < height; i++) {
        for (int j = 0; j < width; j++) {
            Color c = inPixels[i][j];
            outPixels[i][j] = grayLevels[(c.getRed() + c.getGreen() + c.getBlue()) / 3];
        }
    }

でも、力を入れてやった方がいいと聞いたので、こういうことをやってみたのですが、うまくいかないようです。このようにフィルタリングしようとすると、GUI アプリケーションがフリーズします。おそらく、誰かがこのループで私を助けることができますか?

 for (int i = 0; i < height; i++) { 
            for (int j = 0; j < width; j++) { 
                short[][] intensity = computeIntensity(inPixels); 
                Color c = inPixels[i][j]; 

                outPixels[i][j] = grayLevels[(c.getRed() + c.getGreen() + c.getBlue()) / 3];
        }

必要に応じて、使用している他のクラスを投稿できますが、コードはほとんど自明であるため、必要ではないと思います。

編集:ここに強度法があります:

protected short[][] computeIntensity(Color[][] pixels) {
    int height = pixels.length;
    int width = pixels[0].length;
    short[][] intensity = new short[height][width];
    for (int i = 0; i < height; i++) {
        for (int j = 0; j < width; j++) {
            Color c = pixels[i][j];
            intensity[i][j] = (short) ((c.getRed() + c.getGreen() + c
                    .getBlue()) / 3);
        }
    }
    return intensity;
}

ありがとう、マイケル。

4

1 に答える 1

3

上記のコメントで述べたように、より良い式を使用してグレースケールを計算できます : red * 0.299 + green * 0.587 + blue * 0.114

protected Color[][] computeIntensity(Color[][] pixels) {
    int height = pixels.length;
    int width = pixels[0].length;
    Color[][] intensity = new Color[height][width];
    for (int i = 0; i < height; i++) {
        for (int j = 0; j < width; j++) {
            Color c = pixels[i][j];
            intensity[i][j] = new Color(c.getRed() * 0.299, c.getGreen() * 0.587, c.getBlue() * 0.114);
        }
    }
    return intensity;
}

outPixels = computeIntensity(inPixels); 

computeIntensityすでにグレースケールを計算しているため、すべてのピクセルを繰り返し処理する必要はありません。に名前を変更することもできますcomputeGrayScales

于 2012-11-23T09:13:38.800 に答える