Java BufferedImage获得单像素亮度

时间:2014-01-18 15:09:49

标签: java image monochrome

我想将彩色图像转换为单色,我想循环所有像素,但我不知道如何测试它们是亮还是暗。

        for(int y=0;y<image.getHeight();y++){
            for(int x=0;x<image.getWidth();x++){
                int color=image.getRGB(x, y);
                // ???how to test if its is bright or dark?
            }
        }

2 个答案:

答案 0 :(得分:6)

int color = image.getRGB(x, y);

// extract each color component
int red   = (color >>> 16) & 0xFF;
int green = (color >>>  8) & 0xFF;
int blue  = (color >>>  0) & 0xFF;

// calc luminance in range 0.0 to 1.0; using SRGB luminance constants
float luminance = (red * 0.2126f + green * 0.7152f + blue * 0.0722f) / 255;

// choose brightness threshold as appropriate:
if (luminance >= 0.5f) {
    // bright color
} else {
    // dark color
}

答案 1 :(得分:2)

我建议首先将像素转换为灰度,然后应用阈值将其转换为纯黑色和白色。

有些图书馆会为您执行此操作,但如果您想了解图像的处理方式,请访问:

颜色到灰度

有各种转换公式(参见一篇好文章here),我更喜欢“光度”。所以:

int grayscalePixel = (0.21 * pRed) + (0.71 * pGreen) + (0.07 * pBlue)

我无法分辨您使用什么API来操作图像,因此我将上面的公式放在一般术语中。 pRedpGreenpBlue是像素的红色,绿色和蓝色级别(值)。

灰度至黑白

现在,您可以应用以下阈值:

int bw = grayscalePixel > THRESHOLD? 1: 0;

甚至:

boolean bw = grayscalePixel > THRESHOLD;

如果超过阈值,像素将为白色,如果低于阈值则为黑色。通过尝试找到正确的THRESHOLD