【问题标题】:Detect color of a pixel without changing color space在不改变色彩空间的情况下检测像素的颜色
【发布时间】:2017-03-10 18:56:20
【问题描述】:

我们都知道,将猩红色和深红色标记为 RED (0xFFFF0000) 的最简单方法是通过 HSB/HSV 色彩空间。

但是我必须在小型设备上处理大图像,因此此操作(转换和比较阈值)需要太多计算时间。

您知道是否可以对 RGB 值进行相同的操作(在这种情况下仅比较阈值)?

如果(我希望)答案是肯定的,我想知道以下颜色的“标准”阈值:

  • 白色
  • 黑色
  • 红色
  • 蓝色
  • 绿色

因为这些是理论上应该出现在图像中的唯一颜色。

谢谢。

【问题讨论】:

  • 您知道哪些颜色可能出现在最大的体积中 - 首先测试最常出现的颜色可能是最快的。看一下 RGB 颜色立方体,您应该会看到您寻找的所有颜色都在极端角落,因此您的测试可以非常快。
  • 你说得对,但我花了将近一天的时间“反复试验”,很难找到一个准确的衡量标准。要测试的值太多(每种颜色有 3 个上限和 3 个下限)。
  • 如果您的图像中只有这 5 种颜色,只要红色分量超过 127,您就只能有红色或白色。同样,如果绿色分量超过 127,则只能有绿色或白色...
  • 我想我还没有完全理解。 [255,127,0] 是橙色(假设是红色),相反 [0,127,255] 是蓝色,在这两种情况下,绿色都超过 127。你能解释一下吗?
  • 你的问题说你没有橙色 - 你只列出了黑色、白色、红色、蓝色和绿色作为可能的颜色。

标签: image image-processing colors rgb


【解决方案1】:

您可以使用 HSV 公式或转换表从 RGB 和 然后使用转换后的值作为阈值:

http://www.rapidtables.com/convert/color/rgb-to-hsv.htm

编辑:也许我又失踪了,但我会试一试。

由于其 RGB 颜色空间,您可以使用上/下边界。 因此,您需要针对指定的投射值测试每个像素通道:

[Lr, Lg, Lb]

对于红色,可能是:

[128, 0, 0]

此外,您可以增加测试所有像素通道是否相等的可能性(对于某些灰度像素)。 因此,一些保存上/下边界的结构应该如下所示:

struct test_color_stru
   {
   Byte up[3];
   Byte low[3];
   bool cheq; 
   };

您可以创建一个包含所有所需测试颜色的结构数组。 一些用于测试图像值的类 C 代码应如下所示:

bool match[test_color.count]; 
for (int i = 0; i < img.hegith; i++)
    {
    for (int j = 0; j < img.width; j++)    
        {
        for (int k = 0; k < test_color.count; k++)
            {
            match[k] =  true;
            for (int n = 0; n < 3; n++)
                {
                match[k] &=  (test_color[k].low[n] <=  img.pixel.ch[n] &&  img.pixel.ch[n] <= test_color[k].up[n]);                                     
                if (test_color.cheq && n > 0)
                   match[k] &= (img.pixel.ch[n] == img.pixel.ch[n-1]; 
                }
            if (match[k])
               cast_color() // or something you want to do with image pixel     
            }   
        }
    }   

它不适用于一个通道值空闲(在某个 u/l 范围内)而其他通道值必须相等(再次在某个 u/l 范围内)的情况。

【讨论】:

  • 我不想转换成 HSV,就像我之前写的那样,我想在 RGB 空间中找到阈值(如果有的话)。还是谢谢
  • 我误解了这个问题...以为您的图像在 HSV 空间中。对不起。
【解决方案2】:

我认为您可以在每个 RGB 轴上使用 50% 的简单阈值,这将为您提供 8 种可能结果之一。与运行倾向于使处理器停止的 if 语句相比,您可能会发现只进行一些简单的数学运算和查找会更快。

所以,基本上,我们想确定红色是大于还是小于 128,绿色是大于还是小于 128,蓝色是大于还是小于 128。向右移动 7 位将给我们每个的 MSB 并告诉我们。如果我们把红绿蓝的 MSB 做成一个 3 位的数字,我们可以简单地在表格中查找答案。

具体来说,计算:

index= ((R>>5)&4) | ((G>>6)&2) | ((B>>7)&1)

我们现在有一个包含以下位的 8 位数字:

0 0 0 0 0 R G B

如果您按如下方式预先计算静态表:

RGB[0]=Black
RGB[1]=Blue
RGB[2]=Green
RGB[3]=Cyan
RGB[4]=Red
RGB[5]=Magenta
RGB[6]=Yellow
RGB[7]=White

那么你的答案就是

RGB[index]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    相关资源
    最近更新 更多