你的16位转换是
对的
.
-
为了准确比较,我删除了
round
-将所有值保持为类型
double
(仅用于测试目的)。
-
在比较8位和16位的Cb、Cr时,最重要、最令人困惑的是
抵消
在缩放(或除以)之前,需要减去偏移量
256
):
Cb8
Cb16
,并检查比率是否为
256个
,
128
从
Cb8标准
,然后减去
32768
从
Cb16级
减法运算类似于将值居中于0。
Pb8 = Cb8 - 128
Pb16 = Cb16 - 32768
现在你可以比较
Pb8
Pb16
:
Pb16 == Pb8*256
我曾经遵循MATLAB代码(比C更简单):
R = 50;G = 100;B = 150; %Initialize RGB to arbitrary values.
%8 bits conversion
Y = min(max( 0, ( 0.299 * R + 0.587 * G + 0.114 * B)), 255 );
Cb = min(max( 0, (( -0.299 * R - 0.587 * G + 0.886 * B)/1.772 + 128 )), 255 );
Cr = min(max( 0, (( 0.701 * R - 0.587 * G - 0.114 * B)/1.402 + 128 )), 255 );
%Convert RGB to 16 bits.
scale = 256; %Assume conversion from 8 to 16 bits is scale by 256 (not scale by 65535/255).
R = R*scale;
G = G*scale;
B = B*scale;
%16 bits conversion
Y2 = min(max( 0, ( 0.299 * R + 0.587 * G + 0.114 * B)), 65535 );
Cb2 = min(max( 0, (( -0.299 * R - 0.587 * G + 0.886 * B)/1.772 + 32768 )), 65535 );
Cr2 = min(max( 0, (( 0.701 * R - 0.587 * G - 0.114 * B)/1.402 + 32768 )), 65535 );
Ydiff = Y*scale - Y2
Cb_diff = (Cb - 128)*scale - (Cb2 - 32768)
Cr_diff = (Cr - 128)*scale - (Cr2 - 32768)
结果:
Ydiff = 0
Cb_diff = 0
Cr_diff = 0
Cr
Cb
没有偏移量
Pb
和
Pr
E'Cr = ( 0.701 * E'R - 0.587 * E'G - 0.114 * E'B) / 1.402
E'Cb = (-0.299 * E'R - 0.587 * E'G + 0.886 * E'B) / 1.772
Cr = E'Cr + 128
Cb = E'Cb + 128
对于16位:
Cr = E'Cr + 32768
Cb = E'Cb + 32768