发明内容
有鉴于此,本发明的目的在于,提出一种易于纠错的视频预测编码方法,能够很方便地对码流中的错误进行检测、控制并自动纠错。该方法包括如下步骤:
A、按照预定的划分方式将一帧图像分成一个以上的像素集合;
B、在各个像素集合内分别进行预测编码,包括:对像素集合的第一个像素用预先设定的预测值进行预测编码;判断像素集合内除所述第一个像素之外的其他像素是否为像素集合第一行的像素,若是,则根据该像素的前一个像素计算预测值并对其进行预测编码;否则,根据该像素的前一个像素以及前一个像素行内与该像素相邻的像素计算预测值并对其进行预测编码。
步骤A包括:
判断当前处理的像素行是否为预设的像素集合的第1行,若是,在编码生成的码流中写入集合头标记;否则在编码生成的码流中写入行头标记。
若像素值的位宽为8比特,则所述预先设定的预测值为128。
所述判断所述其他像素是否像素集合第一行的像素为如下任意一种:
判断所述其他像素的行号是否为32的倍数,若是则该像素为像素集合的第一行的像素;
判断所述其他像素所处像素行的前一行的行头标记是否为0xFF1F,若是则该像素为像素集合的第一行的像素。
步骤B进一步包括:在每一行编码结束后,根据该行的编码结果计算校验码,将所生成的校验码写入码流中。
所述校验为如下任意一种:异或校验、循环冗余校验或奇偶校验.
所述预测编码为如下方法的任意一种:自适应差分脉冲编码调制ADPCM、差分脉冲编码调制DPCM、离散余弦变换编码或熵编码.
本发明的另一目的在于,提出一种易于纠错的视频预测解码方法,能够很方便地对码流中的错误进行检测、控制并自动纠错。该方法包括:
a、将码流中的数据划分为不同的像素集合;
b、检测码流中是否出现行头标记,根据检测结果确定集合头标记与其后第一个行头标记之间的编码数据为其所在像素集合的第一行像素的编码数据,并对第一行像素的编码数据进行预测解码;确定相邻两次出现行头标记之间的编码数据为其所在像素集合的非第一行像素的编码数据,并对非第一行像素的编码数据进行预测解码。
所述将码流中的数据划分为不同的像素集合为:检测码流中是否出现集合头标记,将两次出现集合头标记之间的编码数据作为一个像素集合的数据.
步骤b所述对第一行像素的数据进行预测解码为:
对于所述像素集合的第一行第一个像素,采用预先设定的固定值作为预测值,并由所述像素集合的码流中解码得到第一个解码值,将该解码值与所述预测值相加得到所述像素集合的第一行第一个像素的像素值;
对于所述像素集合的第一行其它像素,采用其前一个已经解码的像素的像素值进行预测得到预测值,并从所述像素集合的码流中解码得到相应的解码值,将该解码值与所述预测值相加得到解码后的像素值。
步骤b所述对非第一行的像素进行预测解码为:根据本像素集合内已解码的像素进行预测得到预测值,并从所述像素集合的码流中解码得到相应的解码值,将该解码值和预测值相加得到解码后的像素值。
所述步骤b进一步包括,根据码流中像素集合内每一行编码值计算校验码,将所计算出的校验码与码流中对应的校验码进行比较,若比较结果一致,则对所述行像素值的校验通过,输出解码得到的当前行像素;否则校验不通过。
所述校验不通过,且该行像素不是整帧图像的第一行像素,则进一步包括:将解码得到的上一行的像素值与当前行解码得到的像素值进行比较,根据比较结果检测所发生错误是否严重,若是,则对当前解码得到的结果进行纠错处理,并输出纠错后的这一行像素;否则直接输出解码得到的当前行像素.
所述将解码得到的上一行的像素值与当前行解码得到的像素值进行比较,根据比较结果检测所发生错误是否严重包括:
将当前解码得到的这一行的各个像素值分别与解码得到的上一行同一列的像素值相减,所得差的绝对值相加后再平均,得到像素差特征值;将所得像素差特征值与预先设置的阈值比较,若大于阈值,则错误严重,否则错误不严重.
若像素值的位宽为8比特,则所述阈值为4。
所述纠错处理为:将解码得到的前一行像素值拷贝过来作为当前处理像素行的像素值。
从以上技术方案可以看出,本发明方法将一帧画面的全部像素分成多个像素集合,并对每个像素集合独立采用预测编码方法进行编码;这样解码时如果像素出现错误,就可以使得错误被限制在像素集合内而不会蔓延到整个画面。在此基础上,还可以在解码时,对像素是否出现错误以及错误的严重程度进行检验,并根据检验的结果进行纠错,进一步改善解码生成的画面质量。
具体实施方式
本发明的核心内容是:将待编码的一帧画面的全部像素分成多个像素集合,对于每个像素集合独立采用预测编码方法进行编码.这样解码时如果像素出现错误,就可以使得错误被限制在像素集合内而不会蔓延到整个画面。在此基础上,还可以在解码时,对像素是否出现错误以及错误的严重程度进行检验,并根据检验的结果进行纠错,进一步改善解码生成的画面质量。
为使本发明的目的、技术方案和优点更加清楚,下面结合附图与具体实施例对本发明作进一步的详细阐述。
本实施例采用的预测编码方法为自适应差分脉冲编码调制(AdaptiveDifferential Pulse Code Modulation,ADPCM)。本发明方法还可适用于其他预测编码方法,包括差分脉冲编码调制(Differential Pulse Code Modulation,DPCM)、离散余弦变换编码、熵编码等
本实施例中,如图1所示,将一帧画面每32行像素作为一个像素集合,设画面中像素的总行数为m,则一帧画面中的像素可分为n=m/32个像素集合。本实施例的像素集合的划分方式仅是一种示例,本发明并未对所述像素集合的划分方式作出限定。
编码时,在每个像素集合内部独立采用ADPCM方法进行编码,在每个像素集合开始时加入集合头标记,然后对该像素集合的第一行像素进行ADPCM编码;对于其他像素行,在每一行开始加入行头标记,再分别对每一行进行ADPCM编码;对于像素集合内的每一行编码过程中,要对编码产生的码流进行校验,并在每一行编码后面写入对这一行的校验码。本实施例采用的校验方法为异或校验(Block Check Character,BCC),实际也可采用其他校验方法如循环冗余校验(Cyclic Redundancy Check,CRC)、奇偶校验等等。本发明并未对所采用的具体校验方法作出限制。
图2所示为本发明实施例编码后产生的码流结构,其中上图表示一帧画面的码流是由该画面内各个像素集合编码产生的码流所组成;下图表示一个像素集合的码流依次为集合头标记、该像素集合第0行的编码、该像素集合第0行编码的校验码、第1行头标记、该像素集合第1行的编码、该像素集合第1行编码的校验码......第31行头标记、该像素集合第31行的编码、该像素集合第31行编码的校验码。
本实施例的对一帧画面的编码流程如图3所示,包括如下步骤:
步骤301:在编码过程中,判断当前编码的像素行是否为像素集合第1行,若是,则执行步骤302,否则执行步骤303。具体判断方式可以有多种,例如根据当前编码的像素行的行号是否为32的倍数进行判断,若是则当前编码的像素行为像素集合的第1行;或者根据上一行的行头标记的值是否为0xFF1F进行判断,若是则当前编码的像素行为像素集合的第1行。
步骤302:生成集合头标记并写入码流中,对当前编码行进行ADPCM编码,并对编码结果作BCC校验,然后转至步骤304。
所述集合头标记可以是无符号的16比特数,取值范围可以在0xFF20至0xFFCF之间;每一帧的第1个集合头标记取值为0xFF20,而其他每个集合头标记的取值为上一个集合头标记取值加1。
编码的方式有多种,如一种较佳实施例中编码方式如下:用预先设定的固定值作为预测值对该行第一个像素进行编码,对于该行的其他像素,采用前一个像素的预测值对其进行编码。像素值是用三个分量值表示,若像素分量值位宽为8比特,则所述预先设定的固定值可以设为128。如图4所示,像素1为像素集合第一行的第一个像素,则采用预测值为128对像素1进行编码;对于像素2,则用像素1的值计算出预测值对其进行编码;对于像素3则采用像素2的值计算预测值,并依此类推。
BCC校验码为无符号的8比特数,其初值为0,将BCC校验码与当前编码的像素行的编码结果的第1个8比特作异或,运算结果再与编码结果的第二个8比特作异或,...依此类推,与这一行的编码结果运算完毕后,最终结果即为这一行的BCC校验码。
步骤303:生成行头标记并写入码流中,根据当前编码的像素行所在的像素集合完成编码的像素行,对当前编码像素行进行ADPCM编码,并对编码结果作BCC校验,然后转至步骤304。
正如本领域内普通技术人员所知,编码的方式有很多种,如一种较佳实施例中的编码方式可以为:对于每一个像素,采用与该像素相邻,且已经编码的像素值计算预测值对其进行编码。如图4所示,对于像素7,采用像素1和像素2的值计算其预测值;对于像素8,则采用像素1、像素2、像素3和像素7的值计算其预测值;对于像素9,则采用像素2、像素3、像素4和像素7的值计算其预测值,并依此类推。
所述行头标记可以为无符号的16比特数,取值范围可以在0xFF01至0xFF1F之间;每个像素集合的第一个行头标记取值为0xFF01,而其他每次生成的行头标记的取值为本像素集合内上一个行头标记取值加1。
步骤304:将当前编码的像素行的编码结果和校验码依次写入码流中。
步骤305:判断当前帧内是否要有需要编码的像素行,若是则转至步骤301,否则结束当前帧的编码.由于通常都是按照自上而下的顺序进行编码,本步骤一般是判断当前处理的像素行下面是否还有像素行,若是,则将下一行像素作为当前处理像素行并转至步骤301,否则结束当前帧的编码而转入下一帧的编码,而下一帧采用与上述完全相同的方法进行编码。
本实施例的对一帧画面编码形成的码流的解码流程如图5所示,包括如下步骤:
步骤501:检测当前需要进行解码的码流中是否出现集合头标记还是行头标记,若出现集合头标记则转至步骤502;若出现行头标记则转至步骤503。
步骤502:集合头标记到与之相邻的行头标记之间的编码内容作为像素集合的第一行像素进行ADPCM解码,并根据BCC校验码值对编码内容进行校验,校验完毕后转至步骤504。
解码具体方法如下:对于所述像素集合的第一行第一个像素,采用预先设定的固定值作为预测值,并由所述像素集合的码流中解码得到第一个解码值,将该解码值与所述预测值相加得到所述像素集合的第一行第一个像素的像素值;
对于所述像素集合的第一行其它像素,采用其前一个已经解码的像素的像素值进行预测得到预测值,并从所述像素集合的码流中解码得到相应的解码值,将该解码值与所述预测值相加得到解码后的像素值。
步骤503:确定所述行头标记到下一个行头标记之间的编码数据为其所在像素集合的非第一行像素的编码数据,并对该行像素的编码数据进行预测解码,并根据BCC校验码值对编码内容进行校验。
具体解码方式如下:根据本像素集合内已解码的像素进行预测得到预测值,并从所述像素集合的码流中解码得到相应的解码值,将该解码值和预测值相加得到解码后的像素值。
步骤504:判断BCC校验是否通过,若通过则转至步骤507,否则执行步骤505。所述判断BCC校验是否通过为:根据解码得到的内容计算BCC校验码,将所计算的BCC校验码与码流中读取的BCC校验码进行比较,若相同则校验通过,否则为校验不通过。
步骤505:将上一行解码得到的像素值与当前行解码得到的像素值进行比较,根据比较结果检测所发生错误是否严重,若是,则执行步骤506,否则转至步骤507。
所述检测错误的具体做法是:将当前解码得到的这一行的各个像素值分别与解码得到的上一行同一列的像素值相减,所得差的绝对值相加后再平均,得到像素差特征值。由于像素值具有三个分量,所述像素值相减是像素值的三个分量分别相减,则所述像素差特征值也包括三个分量。将像素差特征值的这三个分量分别与预先设置的阈值相比较,若都大于阈值,则认为错误是严重的,需要进行纠错;否则认为错误不严重,解码得到的结果可以接受。
所述阈值设置方式如下:若像素的分量值用8比特表示,即像素分量值的取值范围为0~255,则阈值可以设置为4。实际阈值也可根据实际需要设置为其他值,当所设置的阈值越大,则可能出现的错误越严重;但如果阈值设置过小,又可能对图像过多地进行纠错处理,影响画面质量。
步骤506:对当前解码得到的结果进行纠错处理,并输出纠错后的这一行像素。所述校正的方法可以有多种选择,最简单的方式是将解码得到的前一行像素值拷贝过来作为当前处理像素行的像素值;然后输出当前处理行的像素值,并转至步骤508;
步骤507:输出解码得到的当前行的像素。
步骤508:判断当前帧是否还有需要解码的像素,若是,则转至步骤501,否则结束对当前帧的解码。
本实施例中,当像素集合第一行像素也是图像的第一行像素时,可以对该行像素解码时不进行纠错处理,因此在这种情况下,步骤502进行解码并输出这一行像素后可直接转至步骤501。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。