当前位置: 首页 > 知识库问答 >
问题:

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

刘承运
2023-03-14

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

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

我的目标是(用颜色)在任意图像上绘制,如果是灰度,我必须首先创建一个RGB图像并复制B

最终代码,基于下面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-()的直接值)。解决方案代码没有用于此类图像的专用像素循环。

共有1个答案

邵劲
2023-03-14

你可以试着自己写这个方法。如果一幅图像是灰度的,这意味着它的调色板中的所有颜色都具有相同的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)。从技术上讲,它仍然是灰色的,人类不能将这种颜色识别为非灰色,但以上算法可以。所以我建议计算r、g、b的平均值,如果每个通道和平均值之间的绝对差异小于某个阈值,则将图像检测为灰度。我相信阈值=5是合理的。

 类似资料:
  • 我知道这是一个古老的问题,可以在很多地方找到,但我仍然无法找到解决方案。 我想要的是,如果我使用手机的库存相机拍摄图像或从图库中选择图像,它应该告诉我图像的方向或确切的高度和宽度,以便我可以决定方向。 到目前为止,我使用stackoverflow尝试的是:- 但问题是,当使用相机捕获图像时,它分别给出6和1的纵向和横向。如果从图库中选择图像,它会给我0。所以我无法确定图像是风景还是肖像。 提前感谢

  • 问题内容: 给定文件路径,最简单的方法是知道该文件是否是Java(Android)中的图像(任何形式)?谢谢 问题答案: 有外部工具可以帮助您完成此任务。查看JMimeMagic和JMagick。您也可以尝试使用该类读取文件,但是这样做可能会耗费大量资源,并且并非万无一失。 这个问题已经问过好几次了。请参阅关于同一主题的这些其他线程: 检查文件是否为图像 如何查看上传的文件是图片还是其他文件?

  • 我使用Firebase作为数据库,用户可以上传图像或视频,所以我从我的数据库中提取URL,所以我得到了两个URL,其中一个可以是视频或图像,所以我可以做什么来检测URL。 注意:有些URL没有扩展,比如、、等。我这样说是因为我有一些网址没有与mp4或png等相关的扩展名。

  • 问题内容: 是否可以 不 尝试加载就知道是否已加载Java类?尝试加载该类,但我不希望出现这种副作用。还有另一种方法吗? (我不想覆盖类加载器。我正在寻找一个相对简单的方法。) 问题答案: (感谢Aleksi)此代码: 产生: 请注意,示例类不在软件包中。完整的二进制名称是必需的。 二进制名称的一个示例是

  • 问题内容: 你好,我正在将图像从彩色转换为纯黑白,结果是深色图像。我没有原因。以下是我的代码,它受SO上其他代码的启发。任何指导都会有所帮助。 我没有弄错我在做什么。使用任何其他开放源代码库的任何其他想法都可以。 工作::::: 问题答案: 您实际上并没有将彩色图像转换为黑白图像。您正在创建与空白图片相同大小的新空白图片。您实际上需要做一些处理旧图像的操作。

  • 问题内容: 我试图在网上找到答案,但是找不到特定于实现的答案。 我可以选择,并进行了大量的业务,我想知道我怎么可以在它们之间进行选择? 我已阅读文档的onComplete和的onSuccess,但我可以从火力地堡文档,看这一个,例如,对于(如一个具体操作的示例操作),他们有时用,有时他们使用。 我怎么知道每种情况下哪个更好?有关系吗?考虑到我想知道每个操作是否成功。 问题答案: 顾名思义,将在任务