Как преобразовать пиксели в оттенки серого?

Хорошо, я использую Processing, который позволяет мне получить доступ к пикселям любого изображения как int[]. Теперь я хочу преобразовать изображение в оттенки серого. Каждый пиксель имеет структуру, как показано ниже:

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

Теперь, какие преобразования мне нужно применить к отдельным значениям RGB, чтобы сделать изображение в градациях серого??
Я имею в виду, сколько нужно добавить/вычесть, чтобы сделать изображение в градациях серого?

Обновлять

Здесь я нашел несколько методов: http://www.johndcook.com/blog/2009/08/24/algorithms-convert-color-grayscale/


person An SO User    schedule 14.06.2013    source источник


Ответы (2)


Для каждого пикселя значение для красного, зеленого и синего каналов должно быть их средним значением. Так:

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;

Общая идея заключается в том, что когда у вас есть изображение в градациях серого, цвет каждого пикселя измеряет только интенсивность света в этой точке — и то, как мы это воспринимаем, является средним значением интенсивности для каждого цветового канала.

person Geeky Guy    schedule 14.06.2013
comment
Я также нашел еще несколько методов: johndcook.com /блог/2009/08/24/ - person An SO User; 15.06.2013
comment
один до вашего комментария из-за описанного там метода яркости. Я никогда не думал о взвешивании ценностей таким образом. - person Geeky Guy; 15.06.2013
comment
Я хочу больше узнать об обработке изображений. С чего начать?? - person An SO User; 15.06.2013
comment
@LittleChild Я думаю, что Programmers - хорошее место, чтобы спросить об этом. Что касается меня, я немного научился в колледже, но никогда не углублялся в это. Теперь я хочу делать видеоигры, и я хочу больше этим заниматься. - person Geeky Guy; 15.06.2013

Следующий код загружает изображение и перебирает его пиксели, изменяя насыщенность на ноль и сохраняя те же оттенок и яркость. сильные> значения.

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);
}
person user2468700    schedule 14.06.2013
comment
Нет, он использует Processing, который является диалектом Java. - person An SO User; 15.06.2013