Получение значения пикселя в оттенках серого из цветового пространства RGB в Java с использованием BufferedImage - PullRequest
4 голосов
/ 23 марта 2010

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

Я собирался просто усреднить значения 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 ]

8 голосов
/ 23 марта 2010

В этом учебнике показано 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);
3 голосов
/ 23 марта 2010

это не так просто, как кажется, потому что - это не 100% правильный ответ о том, как сопоставить цвет с оттенками серого.

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

0 голосов
/ 23 марта 2010

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

Проверка Matlab rgb2gray

ОБНОВЛЕНИЕ
Я пытался реализовать метод Matlabв Java, возможно, я сделал это неправильно, но усреднение дало лучшие результаты.

...