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/

4

2 回答 2

11

对于每个像素,红色、绿色和蓝色通道的值应该是它们的平均值。像这样:

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;

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

于 2013-06-14T21:21:14.790 回答
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);
}
于 2013-06-14T21:33:14.630 回答