3

画像フィルタープログラムを作成していて、配列行列を使用してカラー画像をグレースケール画像に変換したいと思います。

これは私が現在持っているものです:

import java.awt.Color;
import se.lth.cs.ptdc.images.ImageFilter;

public class GrayScaleFilter extends ImageFilter {

    public GrayScaleFilter(String name){
        super(name);
    }

    public Color[][] apply(Color[][] inPixels, double paramValue){
        int height = inPixels.length;
        int width = inPixels[0].length;
        Color[][] outPixels = new Color[height][width];
        for (int i = 0; i < 256; i++) {
          grayLevels[i] = new Color(i, i, i);
        }

        for(int i = 0; i < height; i++){
            for(int j = 0; j < width; j++){
                Color pixel = inPixels[i][j];
            outPixels[i][j] = grayLevels[index];                    
            }
        }
        return outPixels;
    }
}

次の式を使用することになっているようです:((R + G + B)/ 3)

次のような配列行列を作成したいと思います。

 Color[] grayLevels = new Color[256];
    // creates the color (0,0,0) and puts it in grayLevels[0],
    // (1,1,1) in grayLevels[1], ..., (255,255,255) in grayLevels[255]

これは、grascaleを使用するときにも参照しているクラスです。

public abstract Color[][] apply(Color[][] inPixels, double paramValue);

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;
}

これを達成する方法についてのフィードバックはありますか?使用する代わりにoutPixels[i][j] = new Color(intensity, intensity, intensity);

4

1 に答える 1

3

grayLevelsこの方法でアレイを構築します。

for (int i = 0; i < 256; i++) {
  grayLevels[i] = new Color(i, i, i);
}

次に、特定の色が必要な場合は、それをとして取得しますgrayLevels[index]

于 2012-11-21T16:09:42.420 に答える