使用位图和 ARGB 扫描图像中的红色 - C#

Scanning for Red Colors in an Image with Bitmap and ARGB - C#

我正在拍照并检查其中是否有任何红色阴影。红色阴影图像中至少有一个像素应该 return 为真。在我的解决方案中,并未涵盖所有红色阴影。我使用位图检查图像中的每个像素。这是我试过的代码:

public bool HasRedColor(string imagePath)
        {
            if(imagePath != null)
            {
                var image = Image.FromFile(imagePath);
                var redColors = TakeRed();

                Bitmap bmp = new Bitmap(imagePath, true);
                for (int i = 0; i < image.Height; i++)
                {
                    for (int j = 0; j < image.Width; j++)
                    {
                        //Get the color at each pixel
                        Color pixelColor = bmp.GetPixel(j, i);

                        //Compare Pixel's Color ARGB property with the picked color's ARGB property 
                        if (redColors.Any(x => x == pixelColor))
                        {
                            return true;
                        }
                    }
                }
                return false;
            }

            return false;
        }

        public List<Color> TakeRed()
        {
            var listOfRedColors = new List<Color>();
            for (int i = 150; i < 255; i++)
            {
                listOfRedColors.Add(Color.FromArgb(255, i, 0, 0));
            }

            return listOfRedColors;
        }
    }

但是,我的函数 TakeRed() 并未涵盖所有红色阴影。关于如何获得所有红色阴影的任何建议?

您所做的是创建一个红色列表,但它是不完整的。您没有考虑 G 和 B 值。如果它们不是 0,但是,比方说,1。这也可以被认为是红色,R 值从 150 到 255。所以你需要附加你的列表,直到你有所有红色阴影。我认为设置范围可能非常主观。

但是! 要将您认为是红色的所有颜色放入列表中并每次遍历列表,您需要检查颜色是否为红色是非常低效的。而是设置范围。例如,如果您说 R 值大于 150 且 G 和 B 值小于 20 的每种颜色,解决方案可能如下所示。

        public bool isRed(Color pixelColor)
        {
            if (pixelColor.R > 0x96 && pixelColor.G < 0x14 && pixelColor.B < 0x14)
            {
                return true;
            }
            return false;
        }

您正在分别检查 R、G 和 B 值是否在范围内。 R、G 和 B 是 byte 类型。您可以使用十六进制值来设置范围。