IVTC/Deinterlace的来龙去脉

IVTC/Deinterlace的来龙去脉
                                 

1 胶片电影:曝光率为24帧/秒的progressive video(连续完整帧图像序列),它由无数个感光晶体(35mm可达5000×5000)实现图像曝光,而人眼在35mm的区域内能分辨的最大极限分辨率为3000×3000,所以用胶片电影来制作各种视频文件分辨率是绰绰有余的。

2 电视:首先区分电视分辨率与pc上的分辨率,pc分辨率就是象素点数,而电视分辨率是指扫描线数,由于电视信号或电视机硬件等因素,电视扫描线数是可变的,只能知道的原理最大扫描线数。

2.1 NTSC和PAL

NTSC是一种分辨率为720×480,帧率为30f/s的电视制式,在美国、加拿大、墨西哥和日本等国应用. PAL分辨率为720×576,帧率25f/s,在欧洲、香港和中东等地区普遍应用,它是NTSC的升级版,解决了NTSC制式中由传输相差引起的颜色偏差问题。

3 TELECINE/IVTC

在电视或PC上播放DVD电影,需要把24f/s的电影转化为25f/s或30f/s,这个过程就叫TELECINE(2:2 pulldown或3:2 pulldown),反之就是IVTC。

对于24f/s film--> 25f/s tv(或其他视频节目),TELECINE不作任何处理,只是把播放速度提高1f/s.

对于24f/s film--> 30f/s tv(或其他视频节目),TELECINE(3:2 pulldown)处理过程如下:把A、B、C、D四帧连续图像分割成场At Ab / Bt Bb / Ct Cb / Dt Db,再做重新排列成At Ab At / Bb Bt / Cb Ct Cb / Dt Db,由此得到五帧图像,场提取为3/2/3/2,因此又可称之谓3:2 pulldown。

4.Deinterlace

电视节目都是隔行扫描(这样做既有历史原因,也有提高视频节目连续性的需求),DVD和一些摄像机采集视频也都是interlace视频(场交错成帧)。由于组成一帧的两个场存在时间差,这些视频文件(节目来源为胶片电影的除外?)在播放过程中会出现齿纹、假象等图像质量问题,这就需要在播放前对视频做去交错处理(Deinterlace)。

DVD是特别为隔行扫描显示器设计的,在NTSC和PAL制式的电视机上能正常显示。由于电视机上的磷粉受电子束扫描有一定的反应时间,因此,当电子束扫完top field,再扫bottom field时,top field并没有立即消失,由此得到50f/s或60f/s的视频效果。

     但是,PC和数字电视机是逐行扫描显示器,要在这些逐行扫描显示器上播放DVD,必须做隔行转逐行转换,这就涉及(一)中所提及的IVTC/Dinterlace。

     DVD制片来源有两种:胶片电影和视频摄录。制片源是胶片电影的DVD中都有破膛(Telecine)标记,根据这一标记做IVTC即可得到24f/s的完整品质的视频。制片源是视频摄录(trully intelaced)的DVD不作Deinterlace处理播放时都会梳齿、拉丝等画质问题,原因就是一帧图像的两个场有时间差,存在相对运动。要消除这类图像的诸多画质问题就必须做Deinterlace处理,方法主要有:Blend,Bob,weave,自适应和运动补偿等。Blend,Bob,weave运算复杂度小,在播放器中较为常用。

1. Blend

     对一帧图像中的两场做叠加、求均值等运算,以消除梳齿。这种方法对于静止图像帧比较有效,运动图像blend后会有残影。下面是一个blend算法的实现:

static void deinterlace_blend( uint8_t *pdst, uint8_t *psrc[],
                                         int width, int height )
{
register int i, j;
register uint8_t *dstl, *srcl1, *srcl2, *srcl3;

dstl = pdst; /* target line */
srcl1 = psrc[0]; /* 1st source line */
srcl2 = srcl1 + width; /* 2nd source line */
srcl3 = srcl2 + width; /* 3rd source line */

/* Copy the first line */
memcpy(dstl , srcl1 , width);
dstl += width;

for (j = 1; j < height-1; ++j) {

    for (i = 0; i < width; ++i) { //(srcl1 + 2*srcl2 + srcl3)/4
      dstl [i] = (srcl1 [i] + (srcl2 [i]<<1) + srcl3[i]) >> 2;

    }

    srcl1 = srcl2 ; srcl2 = srcl3 ; srcl3 += width;
    dstl += width;
}

/* Copy the last line */
memcpy(dstl , srcl3 , width);
}

2. Bob

     用单个场的上下行求均值来填充成为帧,这样的帧图像牺牲了垂直分辨率,图像也偏柔。这种算法较为简单,运算量小,本人实验效果也不错。

3.Weave

     也就是do nothing,只是把两个连续的场拼成一帧,这对于运动图像(制作源为胶片电影的除外)就会产生了梳齿问题。

4. 自适应去交错

     针对不同的图像类型(运动或静止等情况),选择相应的去交错算法。例如,分析两个场的数据,分别用bob或weave做deinterlace,这样产生的图像质量不错。

     还有一些算法,如运动补偿去交错法运算量大,实际很少运用;Discard丢弃偶数场或奇数场,损失一半的数据,这种方法也很少采用。

你可能感兴趣的:(c,算法,video,Blend,BT)