和虽然有些小差异,但数据和这贴结果差不多
http://forum.doom9.org/showthread.php?t=164450
我是用
8bit-RGB—(truncate)—> 23bit-YCbCr —(rounding) —> 16bit-YCbCr—(rounding) —>10bit-YCbCr —(truncate) —> 23bit-RGB —(rounding)—> 8bit-RGB
公式用的是BT.601
把源8bit-RGB和转换后的8bit-RGB对比,100%没有损失
实际操作时
在avs里先用Dither_convert_rgb_to_yuv把8bit-RGB转到16bit-yv12
然后用f3kdb的Ordered dithering转到10bit的(没有找到可用的高精度rounding到10bit的函数)
这个转换带来的损失估计很小
(因为我不放大和源对比,没看出区别,放大400%也几乎没看出区别,
要证明有区别,就是同一画面源png截图大小是60KB,转换后截图是100KB),
这个损失也许是chroma upscaling/downscaling造成的(全程用的是Bicubic)
渲染器用的是不开dither的madVR
问题主要是渲染器方面
如果10bit-YCbCr转到8bit-RGB 这个过程精度不高,那么造成损失是必然的
想请问下一般的渲染器这个过程用的是查表法还是实时运算?
——————————————————————————————————————————————————————————————
如果是查表法的话,那么就不关运算精度的问题了,
但是我想查表法应该也只有8bit-YCbCr转到8bit-RGB的数据
没有10bit-YCbCr转8bit-RGB的
所以接受10bit-YCbCr数据时,右移两位成8bit,然后再通过查表法转到8bit RGB
这个过程损失是挺大的
——————————————————————————————————————————————————————————————
如果是实时运算的话,那么精度有多少呢?
如果运算时精度低,也会造成损失
madVR貌似是先左移位到16bit-YCbCr,
然后转成16bit-RGB,然后再通过dither或rounding到8bit RGB
如果是这样的话,是没什么损失的
但madVR的dither算法好像有点问题的样子
比如我打开一个8bit yv12视频,选了dither,
8bit yv12视频理应来说不会产生dither造成的杂点,
但实际上产生了
没用dither,颜色倒是正常
打开一个8bit-rgb转成10bit的yv12的视频,
没选dither,颜色正确
选了dither,产生了dither带来的杂点
————————————————————————————————————————————————————
我想表达的是
我这里用了madVR的dither
本来能还原成8bit RGB的YUV数据,没能还原,做了dither处理
不能够还原成8bit RGB的YUV数据,却被错误的当做能还原的数据,没有做dither
现在用10bit压制都是用的有损压缩吧,
那么当中有一部分数据是8bit RGB能表达的,有一部分是不能表达的
如果是8bit RGB能表达的颜色,进行了dither处理,
不能表达的颜色没有进行dither处理
那么用madVR渲染出来的视频颜色不就乱了?
————————————————————————————————————————————————————
感觉表达的好混乱
麻烦各位指点迷津,谢谢
avs里
代码: 全选
Dither_convert_rgb_to_yuv(lsb=true)
f3kdb(Y=0,Cb=0,Cr=0,grainY=0,grainC=0,sample_mode=1,input_mode=1,input_depth=16,output_mode=2,dither_algo=2,output_depth=10)
代码: 全选
avs4x264mod -L"x264_64_tMod-10bit-all.exe" --input-depth 10 --qp 1 "FFV1.avs" --output "x264_10bit_i420.mp4"
pause