我想将彩色图像转换为单色,我想循环所有像素,但我不知道如何测试它们是亮还是暗。
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?
}
}
答案 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来操作图像,因此我将上面的公式放在一般术语中。 pRed
,pGreen
和pBlue
是像素的红色,绿色和蓝色级别(值)。
现在,您可以应用以下阈值:
int bw = grayscalePixel > THRESHOLD? 1: 0;
甚至:
boolean bw = grayscalePixel > THRESHOLD;
如果超过阈值,像素将为白色,如果低于阈值则为黑色。通过尝试找到正确的THRESHOLD
。