将灰度图像从 RGB 转换为 YUV 给出非零 U 和 V

converting greyscale image from RGB to YUV gives non-zero U and V

我读到如果图像是 灰度 那么它不应该有 BR[= RGB 中有 27=] 分量,YUV[= 中没有 UV 27=] 色彩空间。 这是否意味着它们应该等于 0?

我正在使用此代码获取 YUV 值:

var px = (this.canvas.Image as Bitmap).GetPixel(i, j);

var y = 0.299 * px.R + 0.587 * px.G + 0.114 * px.B;
var u = -0.14713 * px.R - 0.28886 * px.G + 0.436 * px.B;
var v = 0.615 * px.R - 0.51499 * px.G - 0.10001 * px.B;

我得到非零的 uv 值,尽管它们接近于 0。我应该转换无论如何,他们 int?图片真的是灰度吗?

您从 RBG 到 YUV 的转换使用浮点值乘法。 两个浮点乘法您使用的公式都是近似的,因此结果值不完全为0并不奇怪即使 它是灰度图像。如果您愿意,将 uv 设置为 0 可能是安全的。

假设您的输入图像的颜色为 space RGB(红-绿-蓝),那么所有三个分量在每个像素上都应具有相同的值。如果您的图像不是这种情况(尽管您可能想也可能不想忽略微小的差异),那么它就不是真正的灰度。 RGB 具有三个真正彩色的分量。

另一方面,YUV 颜色 space 有一个亮度(或亮度)通道,即 Y 分量和 2 个色度通道(U 和 V 分量)。

Y 是通过加权平均数从 RGB 分量构建的,请参阅计算 y 的代码。然而,绿色分量得到更多的权重以类似于人眼的灵敏度。三个系数之和为 1.0 且均为正数,因此它们正在计算类似于平均值的线性组合。

但是用于计算 U 分量(对蓝色最敏感)的 3 个系数总和为 0.0。 (对于 V 分量也是如此,它对偏红的颜色最敏感)。因此,假设您输入真正的灰度级 RGB 图像,则生成的 U 和 V 将为 0.0。

如果不是这种情况(假设非常小的值只是 0 的噪声变体),那么您的输入 RGB 图像也不是真正的灰度图像。