是否可以知道SWT图像是灰度还是RGB?

时间:2015-09-22 14:29:15

标签: java swt

我的意思是相当于AWT的BufferedImage#getType(),或其他允许我编写简单isGrayscale()方法的东西。

我使用SWT是因为我需要阅读TIF图像,AWT无法打开。

我的目标是在任意图像上绘制(带颜色),如果是灰度,我必须首先创建RGB图像并在绘制之前复制其中的B& W像素。知道图像是否已经是RGB将保存该转换过程。

最终代码,基于Alex的解决方案

我使用人口标准偏差来更精细地控制RGB值。

private static final double GRAY_LEVEL_STD_SIGMA = 2.4;
public static boolean isShadowOfGray(RGB color) {
    // pure shadow
    if (color.red == color.green && color.green == color.blue) {
        return true;
    }
    // Standard deviation filter
    double mean = (color.red + color.green + color.blue) / 3;
    double std = Math.sqrt((
        Math.pow(color.red - mean, 2) + 
        Math.pow(color.green - mean, 2) + 
        Math.pow(color.blue - mean, 2)) / 3);
    return (std < GRAY_LEVEL_STD_SIGMA);
}

顺便说一句,我认为&#34;直接&#34;调色板图像始终为RGB(它们不包含来自getRGBs()的直接值)。解决方案代码没有针对那种图像的专用像素循环。

1 个答案:

答案 0 :(得分:1)

您可以尝试自己编写此方法。如果图像是灰度图像,则表示其托盘中的所有颜色都具有相同的R,G,B。

public static boolean isGrayscale(Image image) {
    ImageData data = image.getImageData(); // or new ImageData("C:\\image.bmp"); 
    RGB[] rgbs = data.getRGBs();
    for (int i = 0; i < rgbs.length; i++) {
       if (!isShadowOfGray(rgbs[i])) {
          return false;
       }
    }
    return true;
}

public static boolean isShadowOfGray(RGB color) {
   return color.red == color.green && color.green == color.blue;
}

P.S。我想了一下,决定添加关于灰色阴影的几个词。在理想世界中,灰色阴影满足条件r == g == b。但有时(特别是由于jpeg图像中的压缩)颜色可能像(201,198,199)。从技术上讲它仍然是灰色的,人类无法识别这种颜色为非灰色,但上面的算法可以。因此,如果每个通道与平均值之间的绝对差值小于某个阈值,我建议计算r,g,b的平均值并将图像检测为灰度。我认为阈值= 5是合理的。