使用YCrCb色彩空间进行色彩检测?

时间:2009-12-04 15:47:17

标签: java image-processing rgb

此代码我发现尝试跟踪RGB色彩空间中的红色,

  // 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,它没有给出   比上面的RGB更好的结果   因此,我认为   使用YCrCb。

感谢。

3 个答案:

答案 0 :(得分:1)

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

但是,正如kigurai所说,如果你想跟踪颜色,你最好使用HSV(或HSI)格式。在该格式中,H(色调)分量表示颜色本身从0..359(360度)肆虐。因此,为了避免从0..255舍入数字,您可以使用16位矩阵表示内存中的该通道。同样在该颜色空间中,S表示饱和度(在该像素处存在多少H中的颜色成分),S(或I)表示图像亮度。

要实现它的算法并不难:

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

S = 1 - (3 /(R + G + B))*(min(R,G,B))

H = cos ^ -1((((R-G)+(R-B))/ 2)/(sqrt((R-G)^ 2 +(R-B)*(G-B))))

答案 1 :(得分:0)

我建议你改用HSV colour space,这很可能会让这更容易。

答案 2 :(得分:0)

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