为什么我们在将 RGB 转换为 YCBCR 时使用复杂的方程而不是简单的方程?
Why we use a complex equation when do convert RGB to YCBCR instead of a simple one?
当我在 verilog 上实现 RGB2YCBCR 时。我看到了几种将 RGB 转换为 YCBCR 的方法。其中一些非常简单。但是其他的就比较复杂了。
例如,如果我们使用
y = (r >> 2) + (g >> 1) + (b >> 2);
很容易实现到硬件
但是有人说
y = (r*4899 + g*9617+ b*1868+ 8192) >> 14
更快???
我不知道为什么他们有这个方程式,也不知道为什么复杂的方程式比简单的方程式更好。以及为什么他们使用它而不是那个简单的等式。
P/S:我看到OpenCV也用那个复数的。
非常感谢!
在带有乘法器和桶形移位器的处理器上,所有这些操作都需要一个时钟周期,第二个公式不能更快(5 次操作与 7 次操作)。
由于历史和技术原因 (https://en.wikipedia.org/wiki/Rec._601),复杂的 方程是电视技术标准强制要求的。
色彩空间是一个相当复杂的话题。
请注意,第一个公式未标准化:如果输入值在 [0,1] 范围内,则输出在 [0, 10] 范围内,您应该除以 10。这将使第一个公式慢得多。
当我在 verilog 上实现 RGB2YCBCR 时。我看到了几种将 RGB 转换为 YCBCR 的方法。其中一些非常简单。但是其他的就比较复杂了。
例如,如果我们使用
y = (r >> 2) + (g >> 1) + (b >> 2);
很容易实现到硬件
但是有人说
y = (r*4899 + g*9617+ b*1868+ 8192) >> 14
更快???
我不知道为什么他们有这个方程式,也不知道为什么复杂的方程式比简单的方程式更好。以及为什么他们使用它而不是那个简单的等式。
P/S:我看到OpenCV也用那个复数的。 非常感谢!
在带有乘法器和桶形移位器的处理器上,所有这些操作都需要一个时钟周期,第二个公式不能更快(5 次操作与 7 次操作)。
由于历史和技术原因 (https://en.wikipedia.org/wiki/Rec._601),复杂的 方程是电视技术标准强制要求的。
色彩空间是一个相当复杂的话题。
请注意,第一个公式未标准化:如果输入值在 [0,1] 范围内,则输出在 [0, 10] 范围内,您应该除以 10。这将使第一个公式慢得多。