如何将像素转换为灰度?

9

好的,我正在使用 Processing,它允许我将任何图像的像素作为 int[] 访问。现在我想要做的是将图像转换为灰度。每个像素的结构如下所示:

...........PIXEL............
[red | green | blue | alpha]
<-8--><--8---><--8--><--8-->  

现在,我需要对单个RGB值应用哪些转换才能使图像变为灰度?我的意思是,我需要添加/减去多少来使图像变为灰度?

更新

我在这里找到了几种方法:http://www.johndcook.com/blog/2009/08/24/algorithms-convert-color-grayscale/

2个回答

12

每个像素的红、绿、蓝三个通道的值应该是它们的平均值。就像这样:

int red = pixel.R;
int green = pixel.G;
int blue = pixel.B;

pixel.R = pixel.G = pixel.B = (red + green + blue) / 3;

由于您的情况中像素颜色似乎是存储在数组中而不是属性中,因此您的代码可能看起来像:

int red = pixel[0];
int green = pixel[1];
int blue = pixel[2];

pixel[0] = pixel[1] = pixel[2] = (red + green + blue) / 3;

一般的想法是,当您拥有灰度图像时,每个像素的颜色仅测量该点处光的强度 - 我们感知这一点的方式是每个颜色通道的强度的平均值。


3
我还发现了一些其他的方法:http://www.johndcook.com/blog/2009/08/24/algorithms-convert-color-grayscale/ - An SO User
因为那里描述的亮度方法,我将值加权到您的评论之前。我从未想过这样做。 - Geeky Guy
我想更深入地了解图像处理。我应该从哪里开始? - An SO User
@LittleChild 我认为程序员 是一个不错的地方来问这个问题。至于我,大学时学过一点,但没有深入研究。现在我想制作电子游戏,也想更深入地了解它。 - Geeky Guy

2
以下代码加载一张图片并循环遍历其像素,将饱和度更改为零并保持相同的色调和亮度值。
PImage img;

void setup () {
    colorMode(HSB, 100);
    img = loadImage ("img.png");
    size(img.width,img.height);
    color sat = color (0,0,0);

    img.loadPixels();

    for (int i = 0; i < width * height; i++) {
        img.pixels[i]=color (hue(img.pixels[i]), sat, brightness(img.pixels[i]));
    }

    img.updatePixels();
    image(img,0,0);
}

1
不,他正在使用的是Processing,这是Java的一个方言。 - An SO User

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接