检测像素的颜色而不改变颜色空间



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

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

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

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

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

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

谢谢。

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

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绑定中)。

我认为您可以在每个RGB轴上使用50%的简单阈值,这将为您提供8个可能的结果之一。与其运行倾向于失速处理器的if语句,您可能会发现只做一些简单的数学和查找的速度。

因此,基本上,我们要确定红色是否或小于128,是否或小于128,以及蓝色SS是否超过128。给我们每个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]

最新更新