如何旋转yuv420数据?

时间:2010-06-29 05:31:08

标签: c++ algorithm image-processing yuv

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

此致 Anirudh。

3 个答案:

答案 0 :(得分:1)

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

  1. 首先将其转换为平面:为平面分配空间,并根据您拥有的packed YUV格式将字节放在正确的位置。
  2. 分别旋转YUV平面。然后,每个块的“颜色”(UV)信息应保持不变。
  3. 重新组合飞机以重新获得您在开始时拥有的packed YUV
  4. 如果你的图像尺寸是4的倍数,这总是可以正常工作。如果不是,那就小心......

答案 1 :(得分:1)

如果图像是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)的偏移处。

  6. 为了将图像旋转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部分。要复制的第一个像素位于源数组中的(w * h)+(((h / 2)-1)*(w / 2)),将其复制到(h * w)+(0,0)in目标数组。第二个像素是(w * h)+(((h / 2)-2)*(w / 2))等等......

    4. 最后复制V部分。要复制的第一个像素位于源数组中的((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))等......

    5. 以这种方式获得的目标数组包含90度旋转图像。

答案 2 :(得分:0)

我认为YUV420p确实是平面的。

试着看看AviSynth的源代码。转弯(旋转)功能在turn.cpp和turnfunc.cpp

http://www.avisynth.org/