在Java中实现Matlab的rgb2gray

时间:2012-02-27 04:28:41

标签: java matlab image-processing rgb grayscale

我正在尝试根据http://www.mathworks.com/help/toolbox/images/ref/rgb2gray.html在Java中实现Matlab的rgb2gray。我有以下代码:

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是将图像转换为灰度的最简单方法,它具有TYPE_BYTE_GRAY类型的BufferedImage,然后只复制TYPE_INT_(A)RGB的BufferedImage的像素。但即使是这种方法也能提供比Matlab更暗的图像,尽管灰度足够大。我也研究过使用RescaleOp。但是,我无法在RescaleOp中找到设置每个像素的灰度。

作为一项附加测试,我打印出由Matlab生成的Java nad生成的图像矩阵。在Java中,我得到的数字如6316128 6250335 6118749 6118749 6250335 6447714,而在Matlab中,我只得到116 117 119 120 119 115(两个矩阵的前六位数字)。

如何获得类似于Matlab的输出?

1 个答案:

答案 0 :(得分:3)

operator precedence in 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,因为它似乎是文档中的拼写错误。