Как преобразовать пиксели в шкалу серого?
Хорошо, я использую Processing
, который позволяет мне получать доступ к пикселям любого изображения как int[]
. Теперь я хочу сделать преобразование изображения в серое. Каждый пиксель имеет структуру, как показано ниже:
...........PIXEL............
[red | green | blue | alpha]
<-8--><--8---><--8--><--8-->
Теперь, какие преобразования мне нужно применить к отдельным значениям RGB, чтобы сделать изображение серого масштаба?
Я имею в виду, сколько я добавляю/вычитаю, чтобы сделать изображение серого масштаба?
Обновление
Я нашел несколько методов здесь: http://www.johndcook.com/blog/2009/08/24/algorithms-convert-color-grayscale/
Ответы
Ответ 1
Для каждого пикселя значение для красного, зеленого и синего каналов должно быть их средними значениями. Вот так:
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;
Общая идея заключается в том, что когда у вас есть изображение с серой шкалой, каждый цвет пикселя измеряет только интенсивность света в этой точке - и то, как мы воспринимаем, является средним значением интенсивности для каждого цветового канала.
Ответ 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);
}