Java rgb2灰色它是黑暗的

时间:2013-05-14 00:01:22

标签: java matlab rgb

我无法将我的rgb图像直接转换为灰色图像..

我的最终形象是黑暗的,影响了我的工作。

我使用此代码:

public static BufferedImage rgb2gray(BufferedImage bi)//converter
{
    int heightLimit = bi.getHeight();
    int widthLimit = bi.getTileWidth();

    BufferedImage converted = new BufferedImage(widthLimit, heightLimit, BufferedImage.TYPE_BYTE_GRAY);

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

有什么问题?

在matlab中,结果很完美,但是java中的代码很差。

2 个答案:

答案 0 :(得分:0)

我不确定为什么这在Matlab中有效,而在java中无效 - 除了颜色表示在两个平台上都不会以相同的方式处理(但这是推测)。但是,有一种非常好的方法可以做你想做的事情 - 它没有回答你的具体问题(“什么是错的?”),但它应该让你回到你希望做的事情:

How do I desaturate a BufferedImage in Java?

答案 1 :(得分:0)

你的错误似乎是将新的红色,绿色和蓝色值乘以神秘的1.45。

只需删除它并制作代码:

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

Matlab's documentation因为它的rgb2gray函数具有这些系数。