如何找到图像中的所有像素都是灰度或每个像素的 R、G、B 值相等

Posted

技术标签:

【中文标题】如何找到图像中的所有像素都是灰度或每个像素的 R、G、B 值相等【英文标题】:How to find that all pixels in an image are grey scale or has R,G,B equal value for each individual pixel 【发布时间】:2016-04-02 14:53:45 【问题描述】:

请不要引用此How can I check the color depth of a Bitmap? 或How to check if a picture is in grayScale

因为图像可以是每像素 24/32 位,即使所有唯一颜色都是灰度或小于 256 并且每个像素可以是 24 或 32 位。

如何找到图像Bitmap.GetPixel(x, y) 中的像素具有相等的 R、G、B 值,以便确定图像中的所有像素是否都在灰度范围内。因为一个灰度像素的 R,G,B 值是相同的。或者有没有更好的方法来判断图像是否为灰度?

我正在编写一个代码来压缩 16/24/32 位图像的大小,这样如果图像具有 256 种唯一颜色,则将其更改为 8 位图像并保存。

首先,我计算每像素超过 8 个的图像中的唯一颜色。

如果图像中的唯一颜色小于或等于 256 则

    如果所有独特的颜色都在灰度范围内,则将其转换为灰度 否则,如果任何颜色不是灰度,则将图像转换为 8 BPP

uint UniqueColors(Bitmap Bitmap)

    try
    
        List<int> lstColors = new List<int>();

        if (null == Bitmap)
            return 0;

        for (int iCount = 0; iCount < Bitmap.Height; iCount++)
            for (int iCounter = 0; iCounter < Bitmap.Width; iCounter++)
                if (!lstColors.Contains(Bitmap.GetPixel(iCounter, iCount).ToArgb()))
                    lstColors.Add(Bitmap.GetPixel(iCounter, iCount).ToArgb());

        Bitmap.Dispose();

        return Convert.ToUInt32(lstColors.Count);
    
    catch (Exception)
    
        Bitmap.Dispose();
        return 0;
    

然后:

if (256 >= UniqueColors(new Bitmap(string ImagePath)))

    if (Is_Greyscale(new Bitmap(ImagePath))
        Convert_To_Greyscale(ImagePath);
    else
        Convert_To_8Bits(ImagePath);

现在我被困住了,如果图像中的每种独特颜色都在灰度范围内,我该如何找到。我的意思是每种独特的颜色都具有相等的 (R, G, B) 值。比如R=G=B。如何在我的代码行中找到它

Bitmap.GetPixel(iCounter, iCount).ToArgb()

【问题讨论】:

第一:GetPixel 很慢。所以在你的内部循环中两次不是一个好主意。要获得真正的速度,请查看 LockBits。第二:检查Color c = bmp.GetPixel(x,y); 只需执行bool isGrey = (c.R == c.G) &amp;&amp; (c.G ==c.B); 【参考方案1】:

Bitmap.GetPixel() 返回一个Color 结构,其中包含RGB 字段,因此您可以随意比较它们。

请注意,使用GetPixel() 非常慢,但如果您不需要速度,它就可以了。

【讨论】:

谢谢,我很沮丧,以至于互联网上到处都有人建议 Image.PixelFormat 会给出错误的结果。因为图像可以有 256 种独特的颜色,但每种颜色可以是 24 位。因此,图像可以减少到每像素 8 位。

以上是关于如何找到图像中的所有像素都是灰度或每个像素的 R、G、B 值相等的主要内容,如果未能解决你的问题,请参考以下文章

灰度梯度

使用OpenCV如何获取图像每个像素的灰度值??

图片灰度化

灰度图像时0到255之间的像素,哪个函数能把它变成0到1之间的像素

如何遍历所有图像像素然后取灰度值,1通道进行分析?

CUDA:每个线程计算的最佳像素数(灰度)