如何将像素转换为灰度?

Posted

技术标签:

【中文标题】如何将像素转换为灰度?【英文标题】:How to convert pixels to gray scale? 【发布时间】:2013-06-11 15:06:54 【问题描述】:

好的,我正在使用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;

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

【讨论】:

我还发现了几个方法:johndcook.com/blog/2009/08/24/… 由于那里描述的光度方法,您可以发表评论。我从来没有考虑过这样加权值。 我想进一步了解图像处理。我从哪里开始?? @LittleChild 我认为Programmers 是个问这个问题的好地方。至于我,我在大学里学到了一些东西,但从来没有深入过。现在我想做电子游戏,我也想更深入地了解它。【参考方案2】:

以下代码加载图像并循环遍历其像素,将saturation更改为零并保持相同的hue亮度值。

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);

【讨论】:

不,他使用的是Java方言Processing

以上是关于如何将像素转换为灰度?的主要内容,如果未能解决你的问题,请参考以下文章

DICOM图像像素值(灰度值)转换为CT值

几组数据转换为像素图

二进制图片如何转化为值

将RGB转换为黑色或白色

灰度图像时0到255之间的像素,哪个函数能把它变成0到1之间的像素

使用OpenCV如何获取图像每个像素的灰度值??