Реализация Matlab's rgb2gray в Java - PullRequest
4 голосов
/ 27 февраля 2012

Я пытаюсь реализовать Matlab rgb2gray в Java в соответствии с http://www.mathworks.com/help/toolbox/images/ref/rgb2gray.html.У меня есть следующий код:

public BufferedImage convert(BufferedImage bi){
    int heightLimit = bi.getHeight();
    int widthLimit = bi.getWidth();
    BufferedImage converted = new BufferedImage(widthLimit, heightLimit,
        BufferedImage.TYPE_BYTE_GRAY);

    for(int height = 0; height < heightLimit; height++){
        for(int width = 0; width < widthLimit; width++){
            // Remove the alpha component
            Color c = new Color(bi.getRGB(width, height) & 0x00ffffff);
            // Normalize
            int newRed = (int) 0.2989f * c.getRed();
            int newGreen = (int) 0.5870f * c.getGreen();
            int newBlue = (int) 0.1140f * c.getBlue();
            int roOffset = newRed + newGreen + newBlue;
            converted.setRGB(width, height, roOffset);
        }
    }

    return converted;
}

Теперь я получаю изображение в градациях серого, но оно слишком темное по сравнению с тем, что я получаю от Matlab.AFAIK, самый простой способ превратить изображение в оттенки серого - это BufferedImage типа TYPE_BYTE_GRAY, а затем просто скопировать пиксели BufferedImage из TYPE_INT_ (A) RGB.Но даже этот метод дает изображение, которое темнее, чем у Matlab, хотя и в оттенках серого достаточно прилично.Я также изучил использование RescaleOp.Тем не менее, в RescaleOp я никак не могу установить серость на пиксель.

В качестве дополнительного теста я распечатываю матрицы изображений, созданные Java nad от Matlab.В Java я получаю такие цифры, как 6316128 6250335 6118749 6118749 6250335 6447714, а в Matlab я получаю только что-то вроде 116 117 119 120 119 115 (первые шесть цифр обеих матриц).

Как получить аналогичный выходк Матлабу?

1 Ответ

3 голосов
/ 27 февраля 2012

Приоритет оператора в Java указывает, что приведение типов выше, чем умножение. Вы приводите свои константы с плавающей точкой к 0, поэтому я вообще не понимаю, как вы получаете результат в градациях серого. Легко исправить:

        int newRed = (int) (0.2989f * c.getRed());
        int newGreen = (int) (0.5870f * c.getGreen());
        int newBlue = (int) (0.1140f * c.getBlue());

Я бы также заменил 0.2989 на 0.2990, поскольку в документации это опечатка.

...