在ARGB范围内确定像素颜色

3

我正在努力开发车牌识别算法,需要在某些简单的事情上得到一些帮助。

基本上我正在尝试以下操作,代码已经很清楚了,只是我找不到我想要实现的示例。

提前感谢。

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;
           }

编辑:

感谢大家的回复,我在创建这个帖子后没有多想比较,看到问题后进行了修正。我认为我会选择亮度比较,因为我的图像已经被灰度化并具有高对比度。


1
并不是那么简单易懂——如果您的像素具有RGB值250,240,260呢?这应该匹配还是不匹配? - Rowland Shaw
你是想简单地测量反照率(亮度),还是想测量更微妙的东西,比如色彩平衡? - Chris B. Behrens
“Between”对于颜色来说是相当不明确的。就像Rowland所说,蓝色是否在红色和紫色之间?那品红色呢...它是否在黄绿色和紫红色之间?与其提供一个代码示例,你能否用语言表达出你想要实现的目标? - James King
4个回答

2
为了进行正确的比较,您需要为每种颜色推导出一个单一的值。一个很好的选择是亮度,这在这里得到了很好的解释。(关于这个主题的维基百科文章使用了略微不同的系数进行计算。)
测试亮度将允许您比较两种颜色的相对明亮度/暗度。这对于您的车牌检测算法非常有用,因为车牌是黑白的。
文章中计算颜色亮度或亮度的示例:
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 值很可能会导致麻烦。

有趣的信息,但这种特定的加权只有在需要与人类感知进行交互的任务中才有意义。对于机器识别任务,最好根据所观察到的物体的材料/照明属性进行加权。例如,如果文本始终是白色背景上的蓝色,并在广谱光下照明,则仅使用红色和绿色组件通常会为您隔离文本提供更高的对比度。在大多数情况下,简单的未加权平均值就可以很好地工作;适当的照明比加权更重要。 - Dan Bryant
@Dan:这个问题和我的回答是对这个原始问题的跟进:https://dev59.com/32445IYBdhLWcg3wws4u 而我认为亮度测试可能有用的原因。 - Paul Sasik

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
比较运算符未针对 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;
}

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;
        }
    }
}

我想你可以根据自己的需求进行修改!基本上,它通过色调、饱和度和亮度进行颜色比较!(我用它来对颜色进行排序。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接