【发布时间】:2015-09-22 14:29:15
【问题描述】:
我的意思是相当于 AWT 的 BufferedImage#getType(),或者其他允许我编写简单的 isGrayscale() 方法的东西。
我正在使用 SWT,因为我需要读取 AWT 无法打开的 TIF 图像。
我的目标是在任意图像上绘制(用颜色),如果是灰度图像,我必须先创建一个 RGB 图像并在绘制之前复制其中的黑白像素。知道图像是否已经是 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);
}
顺便说一句,我认为“直接”调色板图像始终是 RGB(它们不包含来自 getRGBs() 的直接值)。解决方案代码没有针对此类图像的专用像素循环。
【问题讨论】: