在不改变色彩空间的情况下检测像素的颜色

时间:2017-03-10 18:56:21

标签: image image-processing colors rgb

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

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

您知道是否可以使用RGB值执行相同的操作(仅比较此情况下的阈值)?

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

  • WHITE
  • BLACK
  • RED
  • BLUE
  • GREEN

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

感谢。

2 个答案:

答案 0 :(得分:0)

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

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

编辑:也许我再次失踪,但我会给出一个机会。

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

[Lr,Lg,Lb]< = pixel< = [Ur,Ug,Ub]

对于红色,可能是:

[128,0,0]< = pixel< = [255,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范围内)的情况,它不起作用。

答案 1 :(得分:0)

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

所以,基本上,我们想确定Red是多于还是少于128,如果Green大于或小于128并且Blue ss多于或少于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]