gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:08:03 26 4
gpt4 key购买 nike

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

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

我的目标是在任意图像上绘制(用颜色),如果是灰度图像,我必须首先创建一个 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() 的直接值)。该解决方案代码没有针对此类图像的专用像素循环。

最佳答案

你可以尝试自己编写这个方法。如果图像是灰度图像,则意味着其调色板中的所有颜色都具有相同的 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;
}

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

关于java - 是否可以知道 SWT 图像是灰度图像还是 RGB 图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32719628/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com