2010-03-23 2 views
4

Кто-нибудь знает простой способ преобразования значения RGBint, возвращаемого с <BufferedImage> getRGB(i,j) в значение оттенков серого?Получение значения яркости серого в цветовом пространстве RGB в Java с использованием BufferedImage

Я собирался просто усреднять значения RGB, разбивая их, используя это;

int alpha = (pixel >> 24) & 0xff; 
int red = (pixel >> 16) & 0xff; 
int green = (pixel >> 8) & 0xff; 
int blue = (pixel) & 0xff; 

, а затем средний красный, зеленый, синий.

Но я чувствую, что для такой простой операции я должна что-то отсутствую ...

После большого ответа на другой вопрос, я должен прояснить, что я хочу.

Я хочу взять значение RGB, возвращаемое из getRGB (i, j), и превратить его в белое значение в диапазоне 0-255, представляющее «Темноту» этого пикселя.

Это может быть достигнуто путем усреднения и такого, но я ищу реализацию OTS, чтобы сохранить несколько строк.

ответ

3

это не так просто, как это звучит, потому что is no 100% correct answer for how to map a colour to greyscale.

метод я хотел бы использовать для преобразования RGB в HSL затем 0 S часть (и, возможно, преобразовать обратно в RGB), но это не может быть точно что ты хочешь. (это эквивалентно среднему значению самого высокого и самого низкого значения rgb, поэтому немного отличается от среднего значения всех 3)

+0

Спасибо, я закончил работу с HSV, ваш ответ – Bolster

0

Усреднение звуков хорошо, хотя Matlab rgb2gray использует взвешенную сумму.

Проверить Matlab rgb2gray

UPDATE
Я попытался реализации метода Matlab в Java, может быть, я сделал это неправильно, но усреднение дает лучшие результаты.

+0

Я попробовал тот же @medopal! отличные умы и т. д. ... – Bolster

8

Этого tutorial показывает 3 способ сделать это:

Изменяя ColorSpace

ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY); 
ColorConvertOp op = new ColorConvertOp(cs, null); 
BufferedImage image = op.filter(bufferedImage, null); 

Привлекая к полутоновому BufferedImage

BufferedImage image = new BufferedImage(width, height, 
    BufferedImage.TYPE_BYTE_GRAY); 
Graphics g = image.getGraphics(); 
g.drawImage(colorImage, 0, 0, null); 
g.dispose(); 

С помощью GrayFilter

ImageFilter filter = new GrayFilter(true, 50); 
ImageProducer producer = new FilteredImageSource(colorImage.getSource(), filter); 
Image image = this.createImage(producer); 
+0

Спасибо @polygenelubricants, но я буквально просто ищу эквивалентное значение оттенков серого для отдельного пикселя (но добавил закладки в связанный учебник :)) – Bolster

Смежные вопросы