-2

我希望创建一个 Java 应用程序,它将采用 3 个灰度图像(每个代表红色、绿色和蓝色),然后将它们合并/展平它们/等等。要创建一张彩色图像,我想知道是否有人知道我是否可以使用任何现有的算法或方法?我知道我以前使用过一个名为 ImageJ 的程序,它完全符合我的要求;您选择 3 个图像,可以从中创建 RGB 图像。我知道这是通过使用查找表在 Java 中完成的,这是我以前从未遇到过的,所以甚至不知道从哪里开始。

如果有人对处理它的最佳方法、现有算法、我如何能够自己制作等有任何想法,那就太好了。我不是在寻找任何人为我编码,只是为了引导我朝着正确的方向前进;我为每个 R、G 和 B 灰度图像迭代每个像素的理论可能行不通?

我在这里先向您的帮助表示感谢

4

1 回答 1

3

在 sRGB 颜色空间中工作,很容易实现一个方法来做到这一点。

考虑以下方法:

private static BufferedImage createColorFromGrayscale(BufferedImage red, BufferedImage green, BufferedImage blue){
    BufferedImage base = new BufferedImage(red.getWidth(), red.getHeight(), BufferedImage.TYPE_INT_ARGB);

    for(int x = 0;x < red.getWidth();x++){
        for(int y = 0; y < red.getHeight(); y++){
            int rgb = (red.getRGB(x, y) & 0x00FF0000) | (green.getRGB(x, y) & 0x0000FF00) | (blue.getRGB(x, y) & 0x000000FF);

            base.setRGB(x, y, (rgb | 0xFF000000));
        }
    }

    return base;
}

创建一个新的基础图像,我们通过使用按位 AND 和 OR 创建一个颜色分量,以创建一个 4 字节的 ARGB 格式的整数颜色,该颜色分配给基础图像。通过 for 循环遍历整个图像,我们能够将生成的基础图像的每个像素分别设置为每个通道的颜色。

此方法假定所有三个图像的大小相同。如果图像大小不相等,则必须单独处理(例如,通过在输入之前拉伸图像或修改方法以接受不同大小的图像。)

PS:在处理大图像时,直接使用其中一个缓冲图像实例作为基础图像以节省内存可能会更有效......

于 2013-10-20T12:28:45.587 回答