java – 检查图像是否为灰度的可靠方法

我目前正在研究一个用例,我需要确定上传的图像是灰度还是RGB.我找到了几种方法来识别它,但不确定它们是否可靠并且可以集体用于确认图像是否为灰度.

第1部分:使用Raster读取图像并获取NumberDataElements.

BufferedImage image = ImageIO.read(file);
        Raster ras = image.getRaster();
        int elem = ras.getNumDataElements();

在某些情况下,我观​​察到elem的值为“1”,但并非总体而言.

第2部分:检查每个像素的RGB值.如果R,G,B值与给定像素相同.

BufferedImage image = ImageIO.read(file);
        Raster ras = image.getRaster();

        //Number of Color elements
        int elem = ras.getNumDataElements();

        int width = image.getWidth();
        int height = image.getHeight();

        int pixel,red, green, blue;

        for (int i = 0; i < width; i++)
            for (int j = 0; j < height; j++) {
                //scan through each pixel
                pixel = image.getRGB(i, j);
                red = (pixel >> 16) & 0xff;
                green = (pixel >> 8) & 0xff;
                blue = (pixel) & 0xff;

                //check if R=G=B
                if (red != green || green != blue ) {
                    flag = true;
                    break;
                }


            }

在这里,我检查任何给定像素的R,G,B值是否相同,并且这种行为在所有像素上都是一致的.

我正在使用这两种方法,但不确定它们的准确程度.
请建议..

最佳答案 移动你的if(flag){break;在内部for循环之外的行.

你只需要检查一下(红色!=绿色||绿色!=蓝色).打破这两个等式中的任何一个确保第三个必须被打破,所以你只需要两次检查.

我也可能只是将boolean的isGrayscale变量设置为true,然后在相等逻辑中断时将其设置为false,而不是将标志设置为true.它应该被假定为灰度,直到它破裂并变为假.没有问题,你在这里有旗帜,但这有点更有意义和直观.

如果你想变得非常聪明,你可以允许方差三角形以允许用于目的的足够灰度级的图像,即它们的相等偏差低于设定的障碍.但是这样可行:)

点赞