1

我发现这段代码试图在 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。

谢谢。

4

3 回答 3

1

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

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

算法来实现它并不难:

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

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

H = cos^-1 ( (((RG)+(RB))/2)/ (sqrt((RG)^2 + (RB)*(GB) )))

于 2009-12-04T16:05:14.253 回答
0

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

于 2009-12-04T16:03:42.163 回答
0

我建议您改用HSV 颜色空间,这很可能会使这更容易。

于 2009-12-04T15:51:04.793 回答