gpt4 book ai didi

java - 在 Java 中实现 Matlab 的 rgb2gray

转载 作者:搜寻专家 更新时间:2023-11-01 03:11:19 24 4
gpt4 key购买 nike

我正在尝试根据 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 中找不到设置每个像素的灰度。

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

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

最佳答案

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,因为它似乎是文档中的错字。

关于java - 在 Java 中实现 Matlab 的 rgb2gray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9460079/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com