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

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

相关文章

一文带你搞懂Redis Stream的6种消息处理模式

《一文带你搞懂RedisStream的6种消息处理模式》Redis5.0版本引入的Stream数据类型,为Redis生态带来了强大而灵活的消息队列功能,本文将为大家详细介绍RedisStream的6... 目录1. 简单消费模式(Simple Consumption)基本概念核心命令实现示例使用场景优缺点2

使用Python开发Markdown兼容公式格式转换工具

《使用Python开发Markdown兼容公式格式转换工具》在技术写作中我们经常遇到公式格式问题,例如MathML无法显示,LaTeX格式错乱等,所以本文我们将使用Python开发Markdown兼容... 目录一、工具背景二、环境配置(Windows 10/11)1. 创建conda环境2. 获取XSLT

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Java Response返回值的最佳处理方案

《JavaResponse返回值的最佳处理方案》在开发Web应用程序时,我们经常需要通过HTTP请求从服务器获取响应数据,这些数据可以是JSON、XML、甚至是文件,本篇文章将详细解析Java中处理... 目录摘要概述核心问题:关键技术点:源码解析示例 1:使用HttpURLConnection获取Resp

Java中Switch Case多个条件处理方法举例

《Java中SwitchCase多个条件处理方法举例》Java中switch语句用于根据变量值执行不同代码块,适用于多个条件的处理,:本文主要介绍Java中SwitchCase多个条件处理的相... 目录前言基本语法处理多个条件示例1:合并相同代码的多个case示例2:通过字符串合并多个case进阶用法使用