我正在拍摄图像,并检查其中是否有红色阴影。红色阴影图像中的至少一个像素应返回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()并不涵盖所有红色阴影。关于如何获得所有红色阴影的任何建议?
您所做的是创建红色列表,但是它不完整。您没有考虑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是字节类型。您可以使用十六进制值来设置范围。