【问题标题】:Determine Pixel Color Between ARGB Range确定 ARGB 范围之间的像素颜色
【发布时间】:2011-06-12 17:19:09
【问题描述】:

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

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

提前致谢

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

编辑:

感谢大家的回复,我没有过多考虑比较,创建这个帖子后发现了它的问题。我想我会进行亮度比较,因为我的图像已经过灰度化并且对比度很高。

【问题讨论】:

  • 这不是不言自明 - 如果您的像素的 RGB 值为 250,240,260 怎么办?应该匹配还是不匹配?
  • 您只是想测量反照率(亮度)还是更微妙的东西,比如色彩平衡?
  • “Between”对于颜色来说是相当不确定的。就像罗兰所说,蓝色是“介于”红色和紫色之间吗?洋红色怎么样……是在黄绿色和淡紫色之间吗?除了代码示例,你能用语言表达你想要完成的事情吗?

标签: c# gdi+ pixel


【解决方案1】:

您是否考虑过在另一个色彩空间中工作?使用 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)

【讨论】:

    【解决方案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 值很可能会给您带来麻烦。

    【讨论】:

    • 有趣的信息,但这种特殊的权重只有在您执行需要与人类感知交互的任务时才有意义。对于机器识别任务,您最好根据正在查看的对象的材料/照明属性进行加权。例如,如果文本在白色背景上始终为蓝色,在广谱光下照明,则仅使用红色和绿色分量通常会为您提供更高的对比度来隔离文本。在大多数情况下,简单的未加权平均值就可以了。适当的照明比加权重要得多。
    • @Dan:这个问题和我的回答是这个原始问题的后续:stackoverflow.com/questions/4707607 以及我认为光度测试可能有用的原因。
    【解决方案3】:

    没有为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;
    }
    

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-06-14
        • 2015-11-04
        • 2020-03-26
        • 2018-11-22
        • 2016-07-08
        • 2017-05-04
        • 1970-01-01
        • 2012-09-30
        • 1970-01-01
        相关资源
        最近更新 更多