【问题标题】:How to convert 16 bit Gray Scale image to RGB image in java?如何在 Java 中将 16 位灰度图像转换为 RGB 图像?
【发布时间】:2012-06-27 12:21:07
【问题描述】:

我正在使用 Netbeans 平台在 Java Swing 中制作桌面应用程序。我想将 16 位灰度图像转换为 RGB 图像。我该怎么做?

【问题讨论】:

  • 使用ImageJ
  • 我可以使用 LookUp Table 将 16 位 Gray_Scale 转换为 RGB 吗?如果是,那么如何使用查找表进行转换?

标签: java image swing jai


【解决方案1】:

灰度保存在单个值中,黑色,而 RBG 保存在三个值中,红色、蓝色和绿色。你能做的最好的就是单色图像,你可以用BufferedImage类中的getRGB(x, y)方法来做。由于您的输入图像是灰度的,因此您可以从中获取三个颜色值中的任何一个,因为它们应该是相同的。然后将该值用于您选择作为单色基础的任何颜色。

这是一个红色的例子:

public BufferedImage changeToRedMonochrome(BufferedImage grayImage)
{
    int width = grayImage.getWidth();
    int height = grayImage.getHeight()

    BufferedImage redImage = new BufferedImage(
        width, height, BufferedImage.TYPE_INT_RGB);

    for (int y=0; y<height; y++)
    {
        for (int x=0; x<width; x++)
        {
            Color grayColor = new Color(grayImage.getRGB);
            int gray = grayColor.getRed();

            int red = (gray > 127) ? 255 : gray/2;
            int blue = (gray > 127 ? gray/2 : 0;
            int green = (gray > 127 ? gray/2 : 0;

            Color redColor = new Color(red, blue, green);
            redImage.setRGB(x, y, redColor);
        }
    }
}

这不是完美的代码,当然您需要对其进行调整以满足您的特定需求,但这是制作单色图像的一种方法。

【讨论】:

  • 您的示例中忽略了 redColor 变量...当然,红色、绿色、蓝色分量必须设置为相同的值,希望这正是在 grayImage.getRGB(x, y) (我没有检查,但看起来很有希望)
  • 好点,我很抱歉错过了这一点。我已经修好了。如果您使用类型为 TYPE_BYTE_GRAY 的 BufferedImage,则默认情况下它应该具有相同的颜色值。
  • 如果只设置了红色,那么生成的图像将是黑白的而不是黑白的......我只会使用 grayColor 来得到一个结果图像看起来与输入图像相似。
  • 啊,如果你想要完整的单色光谱,那么你也必须考虑到白色的一半。我再次修改了代码,以说明低于和高于 50% 的灰度值。
  • 我不完全理解你的意图,但我敢肯定,如果你想在最后有一个灰色阴影,那么红色、绿色和蓝色分量应该总是具有完全相同的值...我的意思是 grayColor 变量已经包含正确的值(因为 getRGB 处理颜色空间转换,请参阅 getRGB 的 Javadoc,docs.oracle.com/javase/6/docs/api/java/awt/image/…),您可以在 setRGB 中使用它而无需任何更改。另请参阅我对原始问题的其他回答。
【解决方案2】:

Incompl 描述的 getRGB/setRGB 方法应该可以工作。但是,如果我没记错的话,它的性能相当差(在这种情况下,这些方法做了很多不必要的工作)。我认为在新图像上绘制并让Java优化从BufferedImage.TYPE_USHORT_GRAYBufferedImage.TYPE_INT_RGB的转换会快得多:

int width = grayImage.getWidth();
int height = grayImage.getHeight()

BufferedImage newImage = new BufferedImage(
    width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = newImage.getGraphics();  
g.drawImage(grayImage, 0, 0, null);  
g.dispose();  

【讨论】:

  • 我可以使用 LookUp Table 将 16 位 Gray_Scale 转换为 RGB 吗?如果是,那么如何使用查找表进行转换?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
  • 2016-09-16
  • 2014-11-03
  • 2014-02-26
  • 2014-12-22
相关资源
最近更新 更多