【问题标题】:Determine whether an image is grayscale in JavaJava中判断图像是否灰度
【发布时间】:2013-11-19 16:02:22
【问题描述】:

我正在使用与此类似的东西来(显然是天真的)检查 JPEG 图像的色彩空间:

import java.io.*;
import java.awt.color.*;
import java.awt.image.*;
import javax.imageio.*;

class Test
{
    public static void main(String[] args) throws java.lang.Exception
    {
        File f = new File(args[0]);

        if (f.exists())
        {
            BufferedImage bi = ImageIO.read(f);
            ColorSpace cs = bi.getColorModel().getColorSpace();

            boolean isGrayscale = cs.getType() == ColorSpace.TYPE_GRAY;
            System.out.println(isGrayscale);
        }
    }
}

不幸的是,对于(视觉上)仅显示为灰色的图像,此报告 false

什么检查会做正确的事?

【问题讨论】:

    标签: java awt javax.imageio


    【解决方案1】:

    您可以使用此代码:

    File input = new File("inputImage.jpg");
    
    BufferedImage image = ImageIO.read(input); 
    
    Raster ras = image.getRaster();
    
    int elem = ras.getNumDataElements();
    
    System.out.println("Number of Elems: " + elem);
    

    如果元素的数量返回 1,则它是灰度图像。如果返回 3,则它是彩色图像。

    【讨论】:

    • 这会识别以全彩色保存但仅包含灰色像素的图像吗?
    • 没有。但是,这将作为过滤出具有一个通道的图像的第一步。对于下一阶段,您只需将像素复制到 3D 数组中并检查元素。也经过这个阶段之后,就变成了一个万无一失的判断方法。
    • if (numofChannels == 3){ int[][][] Imagepixelinfo = new int[imWidth][imHeight][numofChannels]; // 带有像素信息的 3d 数组 imageArray(image);// 设置数组 colorORbw = typeChecker(Imagepixelinfo); // 通过检查单个元素后返回 true 或 false 来判断图像是黑白还是彩色 }
    • 有道理,谢谢。该问题所针对的情况与我不再相关,但无论如何我都会切换接受的答案,因为您的帖子包含可用的代码。
    • 谢谢:)。我很欣赏这个姿态。
    【解决方案2】:

    由于r=g=b,图像看起来像灰色,但实际上它是全彩色图像,它有三个通道r g b,而real gray 图像只有一个通道

    【讨论】:

    • 是的,我已经想通了。 ;) 问题是,是否有更智能的检查可以做正确的事情?
    • 最简单的方法是在三个通道时检查r g b
    • @Tomalak 使用来自stackoverflow.com/questions/6524196/… 的信息检查每个单独的像素,并评估每个像素的 R、G 和 B 是否都相等。
    猜你喜欢
    • 2013-01-29
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 2023-03-28
    相关资源
    最近更新 更多