0

实际上,我正在从事一些图像处理项目并在某处受到打击。我必须将彩色图像转换为灰度,为此我已经使用 n 提取了像素的REDGREENBLUE分量的值,GETRGB()现在我想将该像素的RGB值设置为等于其RGB分量的平均值。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

您的代码不会将灰度级别打包回每个颜色组件中。此外,正如我在对该问题的评论中所说,转换为灰度需要考虑人眼对每个颜色分量的敏感度。获取灰度级的典型公式是

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 回答
0

目前尚不清楚您想做什么。如果您尝试生成灰色,我建议您参考以下页面:http ://www.tayloredmktg.com/rgb/ ,其中显示了不同灰度的 rgb 代码。

如果你想获得一个半透明的图像,你必须在 java 中使用 alpha 通道(RGBA 命令)。您还可以通过以特殊方式将底层图像与当前图像合成来获得半透明,但这比使用 Alpha 通道要困难得多。

于 2012-02-02T18:29:45.977 回答