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

问题描述 投票:0回答:1

我正在拍摄图像,并检查其中是否有红色阴影。红色阴影图像中的至少一个像素应返回true。在我的解决方案中,并非所有红色阴影都被覆盖。我使用位图检查图像中的每个像素。这是我尝试过的代码:

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()并不涵盖所有红色阴影。关于如何获得所有红色阴影的任何建议?

c# colors bitmap argb
1个回答
2
投票

您所做的是创建红色列表,但是它不完整。您没有考虑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是字节类型。您可以使用十六进制值来设置范围。

© www.soinside.com 2019 - 2024. All rights reserved.