我的意思是相当于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()的直接值)。解决方案代码没有针对那种图像的专用像素循环。
答案 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是合理的。