Java BufferedImage 灰度到RGB转换

标签 java image bufferedimage

我有一个 8 位灰度位图,我需要对其进行一些模式识别。我用 java 创建了第一个测试框架,它工作得很好。

之后,我将所有内容移植到 C++ 中,发现我的模式不再被发现。

经过一番调查,我意识到在 java 代码中存在从 TYPE_BYTE_GRAY 到 TYPE_3BYTE_BGR 的“隐藏”格式更改。

我可以将其分解为以下测试函数:

public static void ConvertFiles(File dir, String format)
{
    File[] images = getOrderedFiles(dir, format);
    for (int i = 0; i < images.length; i++)
    {
        try
        {
            BufferedImage img = ImageIO.read(images[i]);
            BufferedImage dst = new BufferedImage(img.getWidth() , img.getHeight(), BufferedImage.TYPE_3BYTE_BGR);
            for (int xTarget = 0; xTarget <img.getWidth(); xTarget++)
            {
                for (int yTarget = 0; yTarget <img.getHeight(); yTarget++)
                {
                    int val = img.getRGB(xTarget, yTarget); 
                    dst.setRGB(xTarget,yTarget, val);
                }
            }
            ImageIO.write(dst, "bmp", new File(correctSlash(images[i].getParent()) + "Convert\\" + images[i].getName()));
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

生成的文件似乎“更亮”(抱歉,无法发布图像。我可以根据要求发送它们)。当我在创建新图像时使用 TYPE_BYTE_GRAY 时,没有出现任何变化,因此很明显如何避免 Java 中的效果。

现在的问题是,我更喜欢“明亮”的图像,并且想知道这里发生了什么,以便我可以将其重现为某种图像增强。

提前致谢。

最佳答案

通过与同事深入研究 java 代码 (getRGB()) 发现了它(谢谢 Holger)。

通过查找表对原始灰度值进行转换,生成如下:

l8Tos8 = new byte[256];
float input, output;
// algorithm for linear RGB to nonlinear sRGB conversion
// is from the IEC 61966-2-1 International Standard,
// Colour Management - Default RGB colour space - sRGB,
// First Edition, 1999-10,
// avaiable for order at http://www.iec.ch
for (int i = 0; i <= 255; i++) {
    input = ((float) i) / 255.0f;
    if (input <= 0.0031308f) {
        output = input * 12.92f;
    } else {
        output = 1.055f * ((float) Math.pow(input, (1.0 / 2.4)))
                 - 0.055f;
    }
    l8Tos8[i] = (byte) Math.round(output * 255.0f);
} 

所以至少在部分 Gamma 校正中。

我可以在 C++ 端应用它并获得相同的结果。

关于Java BufferedImage 灰度到RGB转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29675337/

相关文章:

Java:即使存在构造函数方法,类 Rectangle 中的构造函数 Rectangle 也无法应用于给定类型?

嵌入 HTML 的 JAVA Applet 在操作过程中挂起

java - VirtualBox Sdk Java - 从主机操作系统在 guest 操作系统内执行命令

php - 在智能手机和平板电脑中使用 header() 强制使用 php 下载图像

java - Java中HTML Canvas 字节数组到图像

java - 为什么添加firebase后更新apk安装失败?

Android:寻找一种方法来加速通过 wifi 从 Android 到 PC 的图像传输

android - 将图片作为彩信发送

java - 使用 bufferedimage java 设置图像 src

java - 从 JPanel(不带 JFrame)创建 BufferedImage 时,我还可以使用布局管理器吗?