求一个10bitYUV图像操作的算法

caterpillar54321 2012-04-23 10:59:37
10bitYUV图像的显示如图所示。



http://img0.ph.126.net/6eiMPjoVP4vDYPFB8X7Cug==/51509920755472130.jpg
图片好像显示不了,这个地址能打开,麻烦大家自己动一下手了。。。

如图所示,这里一共16个字节,共表示了6个像素

我的一帧图像共有1920 * 1080 个像素,是从文件里读出来的,读出来后指向一个指针 void* videoBuffer

现在需要对这个帧图像进行一些处理,像素的Y和Cb、Cr需要乘以一个系数。

比如77%,

如果是Y的话,就要用 Y 的值 先 减去 16,然后 乘以 77% ,得到的结果再加上 16,得到新的Y值;


如果是Cb或Cr的话,就要用Cb或Cr的值 先 减去128,然后乘以 77%,得到的结果再加上128,得到新的Cb或Cr的值。



因为这个涉及到视频播放的问题,所以对处理的速度要求比较高,一定要在播放下一个视频帧之前处理完成,哪位大侠能给个思路。。。。。。
...全文
470 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
caterpillar54321 2012-04-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

这个首先要明白你的YUV数据在文件里是怎么存放的!存放的格式是什么!比如:YUV420Packed format或者是 YUV420 planner format。然后在依次把,,Y ,Cb,Cr分量读出来,然后乘以77%,这个问题的关键是你要明白YUV数据是在文件里是怎么存放的!
[/Quote]

上面贴了个图,就是YUV422的格式,但是10bit的,该怎么读会更快呢。。。。
juckciy 2012-04-23
  • 打赏
  • 举报
回复
这个首先要明白你的YUV数据在文件里是怎么存放的!存放的格式是什么!比如:YUV420Packed format或者是 YUV420 planner format。然后在依次把,,Y ,Cb,Cr分量读出来,然后乘以77%,这个问题的关键是你要明白YUV数据是在文件里是怎么存放的!
caterpillar54321 2012-04-23
  • 打赏
  • 举报
回复
自己顶。。。大家都吃饭去了吗。。。
zyl910 2012-04-23
  • 打赏
  • 举报
回复
用位运算就能拆开啊,例如——


DWORD* p = videoBuffer;
for(...) // 循环处理每一个像素
{
// 分拆。每次处理4个DWORD
DWORD cb0 = p[0] & 0x3FF; // 低10位
DWORD y1 = p[1] & 0x3FF;
DWORD cr2 = p[2] & 0x3FF;
DWORD y4 = p[3] & 0x3FF;
DWORD y0 = (p[0]>>10) & 0x3FF; // 中间10位
DWORD cb2 = (p[1]>>10) & 0x3FF;
DWORD y3 = (p[2]>>10) & 0x3FF;
DWORD cr4 = (p[3]>>10) & 0x3FF;
DWORD cr0 = (p[0]>>20) & 0x3FF; // 高10位
DWORD y2 = (p[1]>>20) & 0x3FF;
DWORD cb4 = (p[2]>>20) & 0x3FF;
DWORD y5 = (p[3]>>20) & 0x3FF;

// 其他处理:减法、乘法、加法、打包

// next
p += 4
}
zyl910 2012-04-23
  • 打赏
  • 举报
回复
对于电脑而言(电脑显示器),黑色的亮度是0(8位下)。
对于视频设备而言(电视机),黑色的亮度是16(8位下)。

然后在转为非8位时,要进行缩放,既乘以“2^(N-8)”
zyl910 2012-04-23
  • 打赏
  • 举报
回复
摘自MSDN——
http://msdn.microsoft.com/en-us/library/windows/desktop/dd206750(v=vs.85).aspx

Y = floor(2^(M-8) * (219*(L-Z)/S + 16) + 0.5)
U = clip3(0, (2^M)-1, floor(2^(M-8) * (112*(B-L) / ((1-Kb)*S) + 128) + 0.5))
V = clip3(0, (2^M)-1, floor(2^(M-8) * (112*(R-L) / ((1-Kr)*S) + 128) + 0.5))


where
•M is the number of bits per YUV sample (M >= 8).
•Z is the black-level variable. For computer RGB, Z equals 0. For studio video RGB, Z equals 16*2^N-8, where N is the number of bits per RGB sample (N >= 8).
•S is the scaling variable. For computer RGB, S equals 255. For studio video RGB, S equals 219*2^N-8.
caterpillar54321 2012-04-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

10bit的话——应该是“Y减64、Cb/Cr减512”吧
[/Quote]

啊???
这是怎么算的。。。。。。

10bit的Y、Cb、Cr都不对齐啊,还得想办法挑出来再处理,有没有什么效率比较高的方法
zyl910 2012-04-23
  • 打赏
  • 举报
回复
10bit的话——应该是“Y减64、Cb/Cr减512”吧
  • 打赏
  • 举报
回复
哎哟,敲错了,应该是“4个32位字装6个像素...”
  • 打赏
  • 举报
回复
4个23位字装6个像素,恰好可以一次装入SSE寄存器中,但是非整字节对齐,还得把分量移位到16位对齐再运算,然后再移位回去。
caterpillar54321 2012-04-23
  • 打赏
  • 举报
回复
吃完饭顶一下。。。

65,206

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧