确定ARGB范围之间的像素颜色

时间:2011-01-20 19:57:27

标签: c# gdi+ pixel

我正在努力研究我的车辆牌照检测算法,并需要一些简单的帮助。

基本上我正在尝试执行以下操作,代码是自我解释的,我只是找不到我正在尝试实现的示例。

提前致谢

if (img.GetPixel(bottomRightc.X, y) <= Color.FromArgb(255, 255, 255, 255) 
    && 
    img.GetPixel(bottomRightc.X, y) >= Color.FromArgb(255, 166,166,166))
           {
               return false;
           }

编辑:

感谢大家的回复,我没有在比较中考虑太多,并在创建此线程后看到了它的问题。我认为我会进行亮度比较,因为我的图像已经灰度化并具有高对比度。

4 个答案:

答案 0 :(得分:2)

您是否考虑过在另一个色彩空间工作?使用HSV / HSB,您可以简单地执行类似

的操作
if (pixelColor.V <= 255 && pixelColor.V >= 166)
{
    return false;
}

假设最大值 - 亮度0-255。假设您正在尝试完成亮度比较,这对我来说并不完全清楚。

编辑:

System.Drawing.Color中有一些方法,亮度介于0.0和1.0之间。所以上面会变成这样的东西:

    if (pixelColor.GetBrightness() <= 1.0f && pixelColor.GetBrightness() >= 166.0f/255.0f)

答案 1 :(得分:2)

为了进行适当的比较,您需要为每种颜色导出一个值。一个好的候选人是光度很好covered here。 (该主题的wiki article使用稍微不同的系数集进行计算。)

测试光度将允许您比较两种颜色的相对亮度/暗度。这对于您的车牌检测算法非常方便,因为该板是黑白的。

文章计算颜色亮度或亮度的示例:

private static int Brightness(Color c)
{
   return (int)Math.Sqrt(
      c.R * c.R * .241 + 
      c.G * c.G * .691 + 
      c.B * c.B * .068);
}

尝试比较个别的R,G和B值很可能会让你陷入困境。

答案 2 :(得分:1)

没有为System.Drawing.Color定义比较运算符,因此您必须实现自己的比较方法。我建议使用扩展方法,例如:

static class ColorExtensions
{
    public static bool Between(this Color c, Color a, Color b)
    {
        /* insert comparison logic here */
    }

    public static bool LessOrEqual(this Color a, Color b)
    {
        /* insert comparison logic here */
    }

    public static bool MoreOrEqual(this Color a, Color b)
    {
        /* insert comparison logic here */
    }
}

所以你可以使用

var color = img.GetPixel(bottomRightc.X, y);
if(color.LessOrEqual(Color.FromArgb(255, 255, 255, 255) &&
   color.MoreOrEqual(Color.FromArgb(255, 166, 166, 166)))
{
    return false;
}

if(img.GetPixel(bottomRightc.X, y).Between(
   Color.FromArgb(255, 166, 166, 166),
   Color.FromArgb(255, 255, 255, 255)))
{
    return false;
}

答案 3 :(得分:0)

这是我比较颜色的解决方案:

public int Compare(Color x, Color y)
{
    if (x.ToArgb() == y.ToArgb())
        return 0;
    float hx, hy, sx, sy, bx, by;

    // get saturation values
    sx = x.GetSaturation();
    sy = y.GetSaturation();
    // get hue values
    hx = x.GetHue();
    hy = y.GetHue();
    // get brightness values
    bx = x.GetBrightness();
    by = y.GetBrightness();

    // determine order
    // 1 : hue
    if (hx < hy)
        return -1;
    else if (hx > hy)
        return 1;
    else
    {
        // 2 : saturation
        if (sx < sy)
            return -1;
        else if (sx > sy)
            return 1;
        else
        {
            // 3 : brightness
            if (bx < by)
                return -1;
            else if (bx > by)
                return 1;
            else
                return 0;
        }
    }
}

我想您可以修改以满足您的特定需求!基本上它比较颜色的色调,然后是饱和度,最后是亮度! (我用它来分类颜色。)