Java BufferedImage получить яркость одного пикселя
Я хочу преобразовать цветное изображение в монохромное, я думал, что зациклить все пиксели, но я не знаю, как проверить, яркие они или темные.
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 ответа
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
}
Я предлагаю сначала преобразовать пиксель в оттенки серого, а затем применить порог для преобразования его в черно-белый цвет.
Есть библиотеки, которые сделают это для вас, но если вы хотите узнать, как обрабатываются изображения, вот вы:
Цвет в оттенках серого
Существуют различные формулы для преобразования (см. Хорошую статью здесь), я предпочитаю "светимость". Так:
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
экспериментируя немного.