0

実際、私はいくつかの画像処理プロジェクトに取り組んでいて、どこかで衝撃を受けました。色付きの画像をグレースケールに変換する必要があります。このために、 n を使用してピクセルのREDGREENBLUEコンポーネントの値を抽出しました。そのピクセルのRGB値をそのRGBコンポーネントの平均に等しくGETRGB()設定したいと考えています。RGBコンポーネントはそれぞれ INT 変数に格納されているため、このRGBコンポーネントの平均を元のピクセル値に設定するのを手伝ってもらえますか?? コードの一部は次のとおりです。

           rgbArray=new int[w*h];
           buffer.getRGB(0, 0, width, height, rgbArray , 0,width );
           int a,r,g,b; 
           for(int i = 0 ; i<w*h; i++)
            { 
              r = (0x00ff0000 & rgbArray[i]) >> 16;
              g = (0x0000ff00 & rgbArray[i]) >> 8;
              b = (0x000000ff & rgbArray[i]);
              rgbArray[i] = (r+g+b)/3;
            }
           buffer.setRGB(0, 0, width, height, rgbArray , 0,width);

しかし、これは私に灰色のイメージを与えていません。どこで間違いを犯しているのか教えていただけますか。

4

2 に答える 2

0

あなたが何をしたいのかは明らかではありません。灰色を生成しようとしている場合は、次のページを参照することをお勧めします: http://www.tayloredmktg.com/rgb/は、さまざまな灰色の色合いの RGB コードを示しています。

半透明の画像を取得しようとしている場合は、Java でアルファ チャネル (RGBA コマンド) を使用する必要があります。特別な方法で下の画像を現在の画像と合成することで半透明にすることもできますが、それはアルファチャンネルを使用するよりもはるかに困難です.

于 2012-02-02T18:29:45.977 に答える
0

あなたのコードは、グレースケール レベルを各色成分にパックし直していません。また、質問へのコメントで述べたように、グレースケールへの変換では、各色成分に対する人間の目の感度を考慮する必要があります。グレーレベルを取得するための一般的な式は次のとおりです。

G = 0.30 * R + 0.59 * G + 0.11 * B

このウィキペディアの記事が述べているように。

したがって、forループは次のようになります。

for(int i = 0 ; i<w*h; i++)
{
    a = (0xff000000 & rgbArray[i]);
    r = (0x00ff0000 & rgbArray[i]) >> 16;
    g = (0x0000ff00 & rgbArray[i]) >> 8;
    b = (0x000000ff & rgbArray[i]);
    int gray = (int)(0.30 * r + 0.59 * g + 0.11 * b);
    if ( gray < 0 ) gray = 0;
    if ( gray > 255 ) gray = 255;
    rgbArray[i] = a | ( gray << 16 ) | ( gray << 8 ) | gray;
}

もちろん、などgrayで行ったように、ループの外で宣言することもできます。r

于 2012-02-02T21:19:40.433 に答える