1

我需要知道如何将 yuv420p 格式的图像旋转 90 度。将其转换为 rgb、旋转并再次转换为 yuv 的选项是不可行的。即使是算法也会有所帮助。

问候,阿尼鲁德。

4

3 回答 3

3

如果图像是 yuv420 平面图像,这就是图像数据的编码方式。平面意味着首先是 y 截面,然后是 U 截面,然后是 V 截面。

考虑图像的宽度 w 和图像的高度 h。

  1. 图像总大小为 w*h*3/2

  2. Y 截面也称为发光,占 w*h。

  3. Y 部分的每个 2x2 块都有一个 U 像素和一个 V 像素。

  4. 接下来是 U 部分,占据 (w/2)*(h/2) 并放置在距图像开头的偏移 w*h 处。

  5. V 部分紧随其后,占据 (w/2)*(h/2) 并放置在 (w*h)+((w*h)/4) 的偏移处。

为了将图像旋转 90 度,您实际上是将这个 w*h 数组复制到一个 h*w 数组中

如上篇文章所述,您只需分别复制上述 3 个 Y、U、V 块中的每一个。

  1. 从 Y 部分开始。要复制的第一个像素位于源数组中的 (h-1)*w 处,将其复制到目标数组的 (0,0)。第二个像素在 (h-2)*w 等等......

  2. 请记住,U 和 V 部分只有 (w/2)*(h/2)

  3. 接下来复制U部分。要复制的第一个像素位于 Source Array 中的 (w*h)+(((h/2)-1)*(w/2)) 处,将其复制到 (h*w)+(0,0) 中目标数组。第二个像素位于 (w*h)+(((h/2)-2)*(w/2)) 等...

  4. 最后复制V部分。要复制的第一个像素位于 Source Array 中的 ((w*h)+(w*h/4))+(((h/2)-1)*(w/2)) 处,将其复制到 (h目标数组中的 *w)+(w*h/4)+(0,0)。第二个像素位于 ((w*h)+(w*h/4))+(((h/2)-2)*(w/2)) 等...

这样得到的Destination Array包含90度旋转后的图像。

于 2012-04-04T04:03:52.620 回答
1

我想它不是平面 YUV,如果它已经很容易(跳过第一步和最后一步)。你的意思是让 YUV 4:2:0 平面化,但是我不明白你为什么有困难。

  1. 首先将其转换为平面:为平面分配空间并根据您拥有的打包 YUV格式将字节放在正确的位置。
  2. 分别旋转Y, U,V平面。然后,每个块的“颜色”( U, V) 信息应保持不变。
  3. 重新组合飞机以重新获得您一开始拥有的正确包装的 YUV

如果您的图像尺寸是 4 的倍数,这总是可以正常工作。如果不是,请小心...

于 2010-06-29T05:48:06.077 回答
0

我认为 YUV420p 确实是平面的。

尝试查看 AviSynth 的源代码。turn(旋转)函数在 turn.cpp 和 turnfunc.cpp

http://www.avisynth.org/

于 2010-06-29T05:57:24.840 回答