差错控制技术主要是在编码端通过改变策略或添加冗余的方式,将错误限制在一定的范围之内防止误码扩散。使用该法当然是一定程度上保证了视频质量,却增加了带宽。网络流量很可能不够,速度会比较慢。相比之下,错误隐藏是一种在解码端进行处理的技术。错误隐藏就是解码器在不需要从编码器得到额外信息的前提下,利用当前帧已接收宏块或先前已接收视频序列的相关性对丢失宏块进行恢复,以主观可接受的近似原来质量的视频数据来隐藏错误受损的数据。错误隐藏技术要求算法尽可能简单,尤其是实时性比较高的场合。错误也分为帧间隐藏(intra frame,一帧的内部,spatial)和帧内隐藏(inter frame,空间temporal)。
帧内错误比较容易处理,先来说一下帧内错误隐藏的算法实现:采用基于边缘检测错误隐藏或空间像素加权平均算法。
先来说一下丢失块分成哪些类型:
Lena:边缘信息比较丰富,局部纹理比较复杂;
peppers:边缘信息丰富,纹理比较复杂;
baboon:边缘信息较少,纹理复杂;
forman:边缘信息丰富,纹理较少
再来说一下边缘检测:
Sobel边缘检测算子:
http://baike.baidu.com/link?url=_tc38z77JqCqbe47WzeZxjsFvPnJJoeWGo2ZpHjkd78lfP1T54XDifUQ_NSeEuaplcyzajLrBq4vI-Zo8i6Jda
http://www.cnblogs.com/lancidie/archive/2011/07/17/2108885.html
http://homepages.inf.ed.ac.uk/rbf/HIPR2/featops.htm (这里包含了几乎边缘检测的算子,这个网站真是极好的)
我们要知道怎么计算:
我们可以把最中间的那个看做我们要求的点:
该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。如果以A代表原始图像,Gx及Gy分别代表经横向及纵向边缘检测的图像灰度值,其公式如下:
Sobel算子根据像素点上下、左右邻点灰度加权差,在边缘处达到极值这一现象检测边缘。对噪声具有平滑作用,提供较为精确的边缘方向信息,边缘定位精度不够高。当对精度要求不是很高时,是一种较为常用的边缘检测方法。
普利维特算子(Prewitt operate):有噪声平滑作用,可是精度不高。
罗伯茨交叉边缘检测(Roberts Cross operator):精度高,可是计算量大,对噪声比较敏感。
实现基于边缘检测的单一方向的错误隐藏:
(1)进行边缘检测,获取每个像素点的梯度及方向索引K(K由角度决定)。使用Sobel算子,对丢失块周围相邻像素进行检测,得到G和角度a,a取值为(-pi,pi)。对于角度小于0的要加上pi,再对pi/8进行模运算得到。
(2)判断该点的边缘信息是否会通过丢失块,如果是则判断为相关像素,并将其梯度累加到该方向下的数组中去。要判断相关像素,通过角度θ及其坐标判断的。比如有两个点:p1(x1,y1),p2(x2,y2),方向都是θ,则它们在丢失块上边界的交点分别为X1 = 6,X2 = 17,计算公式为:
X1 = xn + (8+1-yn)/ tan θ 像素检测向下延伸后能够通过下边界
X2 = xn + (8+16-yn)/ tan θ 像素检测向上延伸后能够通过下边界
Y1 = yn + (8+1-xn)/ tan θ 像素检测向右延伸后能够通过下边界
Y2 = yn + (8+16-xn)/ tan θ 像素检测向左延伸后能够通过下边界
这里的X1,X2,Y1,Y2分别代表丢失块在相邻像素中的边界上的某个像素点。X1的横坐标固定为8,X2的横坐标固定为25,Y1的纵坐标固定为8,Y2的纵坐标固定为25。当某个像素通过延伸后边界坐标在9~24时,可以判断该点为相关像素。就将该梯度累加到下标为SG[k]当中。如上图p2方向为K,SG[k] = SG[k] + G(xn,yn)
(3)方向插值,根据最大梯度下的方向编号对丢失宏块进行像素插值。根据最大梯度对应一个K,用K作为丢失的插值方向Edgdir。
插值要首先计算出选择相邻边界中那个像素点来进行插值,然后计算出插值点和这两个像素点之间的距离进行加权,最后完成插值算法。选择点的方法和像素判断方法一样。对丢失块中每个像素点进行K方向下延伸,判断其与X1,X2,Y1,Y2的交点,当其交点在边界范围之内时,则可以判断出用于插值的相邻边界像素点坐标。
X1 = xn + (8+1-yn)/ tan (Edgdir *π/8) 像素检测向下延伸后能够通过下边界
X2 = xn + (8+16-yn)/ tan(Edgdir *π/8) 像素检测向上延伸后能够通过下边界
Y1 = yn + (8+1-xn)/ tan(Edgdir *π/8)像素检测向右延伸后能够通过下边界
Y2 = yn + (8+16-xn)/ tan (Edgdir *π/8)像素检测向左延伸后能够通过下边界
(xn , yn)为丢失宏块中某个像素点的坐标位置;X1,X2,Y1,Y2为边界;Edgdir为方向编号。若得到的两个边界点在9~24范围内,取整之后就是可用于插值的相邻边界像素。
比如我们得到两个点pp1,pp2,我们可利用公式:
P,pp1,pp2为像素点的像素值;d1,d2是通过P,pp1,pp2三个像素点的坐标,通过两点距离公式计算得到的两点之间的距离。
以上方法基于边缘检测错误隐藏算法只单独一个方向上插值的时候比较好!如果边缘信息太复杂的时候就会出现虚假边缘。这时候就采用空间算数加权算法可以得到比较好的效果。什么时候采用边缘检测的单方向什么时候采用空间像素加权平均算法。采用将最大梯度SG[k]比总共的梯度,我们设置一个阈值,比如0.2。若比值大于阈值,说明边缘信息比较简单,所以可以进行边缘检测的单方向线性插值。否则采用空间像素加权平均算法实现。根据这个比值,我们选择是采用空间像素加权平均还是边缘检测的单一方向插值算法。
所以对于图像的边缘信息在一个方向下进行插值,因此对于边缘信息比较单一的丢失块隐藏效果较好。对于纹理复杂的丢失块,空间像素加权平均算法效果较好。
H.264 是ISO运动图像专家组与ITU-T的视频编码专家组联合推出的新一代视频压缩编码标准,其主要目的是提高压缩效率和增加网络友好性。由于使用了高效的编码技术,如帧内预测、1 /4像素精度运动补偿、多参考帧等,H.264的 编码效率得到极大提高,但也使 得编码后的码流对错误更加敏感,任何一个比特的错误不仅可能破坏当前帧,还可能造成错误扩散,导致后续视频帧质量的严重下降 。错误隐藏就是当图像发生错误时,在解码器端充分利用视频数据的相关性进行的图像修复措施 ,以降低错误的影响,提高视频的主 观质量。H.264错误隐藏分为帧间错误隐藏和帧内错误隐藏,前者利用时间相关性 ,通过先前已经正确接收到的图像帧来恢复当前丢失的图像帧信息。后者则是利用空间上的相关性 ,通过一帧内已经接收到的宏块来恢复丢失宏块的信息。空间加权像素平均算法是H.264自带的帧内错误隐藏算法,该方法对平滑区域的隐藏效果较好,但是对于有边缘的信息块,隐藏效果较差。
参考论文:
基于H.264/AVC的自适应视频错误隐藏技术算法 包宋建等
基于边缘检测及方向加权的H.264帧内错误隐藏算法 李强等