4

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

        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?
            }
        }
4

2 回答 2

8
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
}
于 2014-01-18T22:59:04.047 回答
2

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

有一些库可以为您执行此操作,但如果您想了解如何处理图像,请访问:

彩色转灰度

有多种转换公式(请参阅此处的一篇不错的文章),我更喜欢“亮度”公式。所以:

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

我不知道您使用什么 API 来操作图像,所以我笼统地保留了上面的公式。pRedpGreen并且pBlue是像素的红色、绿色和蓝色级别(值)。

灰度到黑白

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

int bw = grayscalePixel > THRESHOLD? 1: 0;

甚至:

boolean bw = grayscalePixel > THRESHOLD;

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

于 2014-01-18T15:17:58.937 回答