2009-12-04 92 views
1

此代码,我发现试图追踪红色在RGB色彩空间,使用YCrCb颜色空间进行颜色检测?

// red color detection, turn the detected one into white 
    if (((red > (0.85 * (green + blue))) && (red > 105)) 
    && ((red - green > 73)) && (((green < 150) 
    || ((green >= 150) && (blue > 140))))) { 
     // set the pixel to white 
     red = 255; green = 255; blue = 255; 
    } 

有谁知道如何使用的YCrCb色彩空间,而不是RGB跟踪的颜色? 我只是不知道每种颜色的范围究竟是为了追踪它, YCrCb中的红色范围。

编辑:我已经试过HSV,它不上面 预期,因此,我认为 使用的YCrCb给 比RGB更好的结果。

谢谢。

回答

0

在YCbCr中,每个组件的典型范围是16到240。请参阅以下Wikipedia entry,其中详细介绍了在RGB和YCbCr之间转换的各种公式。

1

首先,您可以看看here以获得更好的定义。这种颜色模型(YCrCb)更广泛地用于mpeg等视频格式。大多数视频格式,如果视频使用格式4:2:2,这意味着Y分量(代表亮度)具有与源RGB图像相同的大小,而Yb(蓝色分量)和Yr(红色分量)被表示到原始图像分辨率的一半。这样做可能会减少文件的带宽。

但是,正如kigurai所说,如果你想追踪颜色,你最好使用HSV(或HSI)格式。在这种格式中,H(Hue)分量表示颜色本身从0到359(360度)肆虐。所以为了避免将数字从0..255舍入,你可以使用一个16位矩阵来表示内存中的那个通道。同样在这个色彩空间中,S表示饱和度(在该像素中存在多少H的色彩分量),并且S(或I)表示图像亮度。

要算法来实现不难:

I = 1/3 *(R + G + B)

S = 1 - (3 /(R + G + B))* (((RG)+(RB))/ 2)/(sqrt((RG)^ 2 +(RB)*(GB(min)(R,G,B))

))))