简化视频去隔行和格式重定处理

2024-03-03 16:18

本文主要是介绍简化视频去隔行和格式重定处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简化视频去隔行和格式重定处理

http://blog.gkong.com/more.asp?name=barongeng&id=30826

耿磊 发表于 2007/12/7 14:10:25

大多数普通视频信号在利用视频压缩编解码器进行编码之前都必须进行预处理,这要求数据采用420平面格式(planarformat)以获得更高的处理性能。例如,NTSC和PAL等广播标准可能需要将隔行扫描(interlaced)格式转换为逐行扫描(progressive),此外还常常需要对色度和亮度信息进行格式重定。

特别的是,CCD相机的视频是以4:2:2交错式隔行扫描格式被捕获的。但视频压缩标准的特定规格只接受逐行扫描4:2:0格式的输入。在这种情况下,必须去掉隔行扫描伪信号,因为对逐行扫描编码器而言,处理隔行扫描视频内容可能相当困难。

有大量复杂的去隔行(de-interlacing)算法可供工程师选择,但并非所有应用都需要最高级别的视频质量。此外,复杂的算法往往需要大量的计算,而开发人员总是受到数字信号处理器(DSP)的MIPS预算限制。

当应用不需要最高级别的视频质量时,可在硬件中采用缩放算法来实现去隔行。这种技术可以将4:2:2到4:2:0格式的转换工作和去隔行操作卸载给其它硬件,这对于节省珍贵的DSPMIPS资源特别有帮助。令人惊讶的是,当把视频压缩处理考虑进来之后,缩放硬件有时能获得可与高复杂度去隔行算法相媲美的去隔行质量。

本文描述的简单方法可用于视频应用的去隔行处理。当视频数据帧中存在大量动作时,这种技术最为有效,因为静态图像往往会更加突出缺陷。

亮度和色度编码

NTSC将标准清晰度(NTSC SD)的分辨率定义为每行720像素,每列480像素,每秒30帧。每个像素的信息包含三个分量:Y是亮度(luma)信息,Cb(U)是蓝色信息,Cr(V)是红色信息。

过去采用NTSC标准时,工程师在视频流编码方面受到传输带宽和计算能力的限制。由于人眼对于亮度信息更为敏感,而NTSC标准只要求色度信息进行2:1的水平下采样,从而减轻了这一负担。

CCD相机捕获到的每一帧都具有720×480的Y值、360×480的U值和360×480的V值。其中每一个值都是8位(1个字节),范围在[0,255],这样,每一个NTSC SD帧就是(720+360+360)×480=691,200字节。

被捕获帧的Y/U/V分量一般进行隔行扫描,通常采用YUV 4:2:2的格式。有两种方法构成这些数据,但为了简单起见,假设数据是以UYVY 4:2:2隔行扫描格式构成的(图1)。

如前所述,大多数编码器都要求输入视频采用YUV 4:2:0格式。在4:2:2隔行扫描数据和4:2:0平面数据之间存在着两大差异。

在4:2:0格式中,色度信息还需进一步进行2:1的垂直下采样。也就是说,对每一个NTSCSD帧,每个U或V分量都包含360×240字节而不是360×480字节。这样,每个4:2:0格式的NTSCSD帧为518,400字节[(720×480)+(360×240×2)]。为平衡实时性能和合格的图像质量,需要额外的色度下采样。

视频压缩标准的有效实现还常常需要将亮度和色度分量分别存储,因为编码算法可能采用不同的方法来处理它们。图2所示为4:2:0平面格式的NTSC SD视频帧。

隔行扫描伪像

隔行扫描包含对图像的两次扫描,一次扫描捕获偶数行,另一次扫描捕获奇数行。两次捕获以很小时差分隔开,然后再合在一起形成一个完整的帧。

在合并这两部分时,可能会形成隔行扫描伪信号。例如,矩形框的垂直边缘将导致锯齿效应(见图3的最后一帧)。在不同时间捕获一个运动视频目标而产生的这种伪信号被称为隔行伪像。

对于NTSC标准,若以30帧/秒的速度捕获视频帧,两个连续镜头(即顶场及其互补的底场)之间的启动时间是16.67ms。如果在这类帧中捕获视频场景中的快速运动行为,将会产生隔行扫描伪像。

由于这些伪信号被表示为高频噪声,它们有可能会导致逐行视频编码器出现严重问题,其主要原因在于人眼的敏感度以及压缩标准的工作方式。实际上所有的视频压缩标准都是基于两个非常重要的假设:1.人眼对低频信息更为敏感,这意味着即使去掉原始帧中的部分高频信息,仍然可以保持可接受的视觉质量。2.编码过程基于像素块进行,这意味着对于视频帧中的每个16×16或8×8的像素块,在相邻帧中都可能存在非常相似的模块。因此,编码的实现通常是在前面的编码帧中寻找一个相似的像素块,并仅对它们之间的delta进行编码。这样可以获得很高的压缩比,而在大多数压缩标准中,运动评估(ME)模块就是专为该目的而定义的。

遗憾的是,几乎所有像素块中都可能出现隔行扫描伪像,这使得ME模块很难在前面的编码帧中找到相似的像素块。结果使得delta更大,并且ME需使用更多的比特来对其进行编码。因此,最好的方法是在将被捕获的帧馈入到逐行视频编码器之前,减少或去除其中的隔行扫描伪信号。

去隔行视频处理

如前所述,可以通过采用大量计算的复杂算法来实现高质量的去隔行处理。此外,还有一种更直接简单的方法,即采用缩放硬件,例如德州仪器的TMS320DM6446数字媒体处理器。采用缩放硬件可完全去除全部场力线,它利用剩余场的信息来产生丢失数据。

去除480i60(480像素、隔行扫描、60帧/秒)视频的所有底场数据,将产生一个240p30(240像素、逐行扫描、30帧/秒)的视频。该数据被垂直缩放,以产生一个480p30的去隔行结果。这种方法的优点是可以100%地消除所有隔行扫描伪信号,但垂直保真度会有明显损失。

当用作逐行压缩之前的预处理步骤时,这种方案能够产生非常棒的效果。这是因为有损视频压缩算法通常都去掉了高频信号(尤其是在低比特率下)。

因此,根据数据源内容的不同,在把压缩处理考虑进来之后,该方案可以达到和复杂算法一样的效果。例如,可以利用复杂度较低的去隔行器来把隔行扫描广播数据转换成低比特率数据以供逐行扫描手机屏显示。

设计实现

TMS320DM6446处理器中的缩放器(resizer)执行和所有缩放器相同的常用功能,但有少许差别。需注意的两个主要特性是,缩放器模块在水平和垂直方向上都能支持1/4x到4x的缩放,且缩放因子与方向无关。

此外,所有滤波器系数都是可编程的。例如,如果使用4:2:2隔行扫描格式(由UYVY格式构成)的输入帧(图1),分辨率为每帧720×480像素(NTSC SD)。

在去隔行处理中,缩放器首先被告知输入帧的宽度为724像素,而非实际的720像素。这是由于为准确实现1:1的缩放,DM6446处理器的水平输入大小必须被调节为720+delta,delta由缩放器中的公式计算求得。

接着,缩放器获知间距是实际间距的两倍宽,这样它就可以把第一组两个水平扫描行当作一个来接收。这使得缩放器可以在偶数行上实现1:1的水平缩放(见图4中的左上角),并将奇数行丢弃(右上角)。输入和输出在垂直方向上尺寸分别被设定为244和480,因此缩放器执行1:2的垂直放大以插入被丢弃的奇数行。

然后缩放器被告知输出帧的宽度是720像素,输出间距是1440[720+(360×2)]字节,从而形成一个输出帧(图4)。

为实现从4:2:2到4:2:0的转换,以便逐行编码器能够利用这些数据,对于每个4:2:2隔行扫描格式的输入帧,缩放器都被调用三次以生成去隔行的4:2:0帧。必须保持三组配置参数分别作为U、Y和V值。因此,需调用缩放器三次。

起始点是采用UYVY 4:2:2格式的输入帧(NTSC SD分辨率)。输出帧被定义用4CIF分辨率(704×480)代替NTSCSD分辨率(720×480)。由于缩放器的32字节输出对齐限制,输入帧的右边16列必须被丢弃。一种替代方法可能是将右边8列和左边8列删减掉。

首次调用是提取输入帧中的Y分量,然后对其进行去隔行处理。通过指示缩放器将输入帧当作一个4:2:0平面格式的图像(图5),去隔行操作应该仅应用于Y分量上。此外,缩放器还被指示执行2:1的水平缩放,间隔提取输入帧中的Y分量,并执行1:2的垂直缩放以在奇数行中插入被丢弃的Y分量。

对缩放器的第二次调用是修改U分量,这需要以2:1的比例进一步垂直下采样。由于下采样需丢弃所有的奇数行,这会自动生成逐行U缓冲器,因此不再需要进行去隔行操作。为实现垂直下调节(downscaling),垂直输入大小被设为484,输出大小被设为240。对V分量的操作类似于U分量。


对于在利用视频压缩编解码器进行编码之前需要去隔行和YUV格式转换的视频,可通过一个缩放引擎来对其进行预处理。由于某些因素(例如视频编解码器往往去除了高频分量)的影响,需对压缩后的视频质量进行考虑。不过,这项技术并不适合于所有应用,而且必须小心确保输出质量是应用可以接受的。

作者:Zhengting He、Snethil Natarajan

软件应用工程师

德州仪器公司

track:http://cn.fpdisplay.com/technology/Tech_Shtml/2_2007124102915701.shtml


这篇关于简化视频去隔行和格式重定处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/770172

相关文章

Java docx4j高效处理Word文档的实战指南

《Javadocx4j高效处理Word文档的实战指南》对于需要在Java应用程序中生成、修改或处理Word文档的开发者来说,docx4j是一个强大而专业的选择,下面我们就来看看docx4j的具体使用... 目录引言一、环境准备与基础配置1.1 Maven依赖配置1.2 初始化测试类二、增强版文档操作示例2.

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

Mysql常见的SQL语句格式及实用技巧

《Mysql常见的SQL语句格式及实用技巧》本文系统梳理MySQL常见SQL语句格式,涵盖数据库与表的创建、删除、修改、查询操作,以及记录增删改查和多表关联等高级查询,同时提供索引优化、事务处理、临时... 目录一、常用语法汇总二、示例1.数据库操作2.表操作3.记录操作 4.高级查询三、实用技巧一、常用语

利用Python脚本实现批量将图片转换为WebP格式

《利用Python脚本实现批量将图片转换为WebP格式》Python语言的简洁语法和库支持使其成为图像处理的理想选择,本文将介绍如何利用Python实现批量将图片转换为WebP格式的脚本,WebP作为... 目录简介1. python在图像处理中的应用2. WebP格式的原理和优势2.1 WebP格式与传统

电脑提示xlstat4.dll丢失怎么修复? xlstat4.dll文件丢失处理办法

《电脑提示xlstat4.dll丢失怎么修复?xlstat4.dll文件丢失处理办法》长时间使用电脑,大家多少都会遇到类似dll文件丢失的情况,不过,解决这一问题其实并不复杂,下面我们就来看看xls... 在Windows操作系统中,xlstat4.dll是一个重要的动态链接库文件,通常用于支持各种应用程序

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w