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 экспериментируя немного.

Другие вопросы по тегам