发明名称 防误码扩散的JPEG‑LS图像无损/近无损压缩算法硬件实现方法
摘要 本发明公开了一种防误码扩散的图像无损/近无损压缩方法:采用并行预测方式,将分块的图像通过两路并行得到预测结果,在每个预测环节,像素之间间隔一个像素时钟周期,使得由参数索引、预测修正、残差计算、参数更新反馈环路可使用流水线设计;在近无损压缩模式下,每个像素有足够的时间进行像素重建,在当前像素进行上下文建模前能刚好得到上一个像素对应的像素重建值;通过引入分块压缩与检纠错编码相结合的方法,防止了误码的大面积扩散,提高了抗信道误码性能,同时子块大小可调,检纠错编码方式可调;进行分区域近无损压缩,可根据实际应用需求,对图像的不同区域采用不同的近无损参数Near进行压缩,可进一步提高图像的整体压缩比。
申请公布号 CN105828070B 申请公布日期 2016.12.28
申请号 CN201610165800.8 申请日期 2016.03.23
申请人 华中科技大学 发明人 颜露新;张天序;陈立群;桑红石;钟胜;李军
分类号 H04N19/107(2014.01)I;H04N19/176(2014.01)I;H04N19/15(2014.01)I;H04N19/166(2014.01)I;H04N19/423(2014.01)I;H04N19/124(2014.01)I 主分类号 H04N19/107(2014.01)I
代理机构 华中科技大学专利中心 42201 代理人 曹葆青
主权项 一种防误码扩散的JPEG‑LS图像无损/近无损压缩算法硬件实现方法,其特征在于,包括以下步骤:(1)预设参数(1.1)读入像素位宽参数pixel_width;(1.2)读入子块大小参数:子块行数row_size和子块列数column_size,确定最小编码单元MCU(Minimum_Coded_Unit)子块大小;(1.3)读入检纠错模式选择参数correction_mode,选通所需的检纠错编码方式:RS编码或者屏蔽检纠错编码;(1.4)利用图像的帧同步信号对上述参数进行锁定,保持在一幅图像进行压缩的时候,子块大小参数和检纠错模式选择这两种参数不变;(2)输入像素值和近无损度参数Near,进行图像分块(2.1)将需要压缩的图像像素数据和与每一个像素对应的近无损度参数Near一起输入至图像缓存与分块模块中;(2.2)根据读入的子块大小参数控制图像的缓存量,当存储器中图像的行数等于子块行数时,通过控制读地址按照设定好的子块大小参数逐块读出图像像素Ix和与该像素所对应的近无损度参数Near,通过这种方式将整幅图像分成若干子块,并以子块作为最小编码单元进行压缩编码;(3)以图像子块为单位,将串行数据转换为两路并行数据(3.1)像素数据和与之对应的近无损度参数Near按子块为单位串行输入到4个FIFO所组成的结构中;第1个子块的像素按照像素时钟连续写入FIFO1中,写完一个子块后,第2个子块的像素按照像素时钟连续写入FIFO3中,以此类推,第3个子块的像素按照像素时钟连续写入FIFO2中,之后第4个子块的像素按照像素时钟连续写入FIFO4中,后续子块按照以上顺序依次写入四个FIFO中;(3.2)像素数据按子块为单位分为并行两路输出到两路预测编码模块;FIFO1和FIFO2以图像子块为单位交替输出像素Ix和与该像素所对应的近无损度参数Near至预测编码模块1,并且每个像素之间间隔一个像素时钟周期;同样的,FIFO3和FIFO4以图像子块为单位交替输出像素Ix和与该像素所对应的近无损度参数Near至预测编码模块2,并且每个像素之间间隔一个像素时钟周期;(3.3)上下文参数RAM初始化:在每一个子块的像素写入FIFO之前,对该子块所对应的近无损度参数Near值进行采样,并对上下文参数RAM进行初始化操作;(4)并行预测编码模块:采用空间并行原理,设置两路预测编码模块,同时进行预测编码,生成Golomb编码所需的变量;(4.1)上下文建模:把重建后的像素值Rx输入到“FIFO+寄存器”缓存结构中,根据子块大小参数控制FIFO的读时机,当已经缓存了子块中一行的像素后,开始从FIFO中读出数据,从寄存器上依次获得当前像素值的近邻a、c、b、d,同时统计当前像素在子块中的坐标值;根据行列计数得到当前像素的坐标值,并读取每一个子块的第一个像素,即首像素Fp;再根据当前像素值的行列坐标和子块大小参数对当前像素的4个近邻进行边缘处理,获得重建值Ra、Rc、Rb、Rd:当前像素的坐标为子块的第一行第一列时,Ra、Rc、Rb、Rd均等于首像素Fp;当前像素的坐标为子块的第一行非第一列时,Ra等于对应坐标的像素值a,而Rc、Rb、Rd均等于首像素Fp;当前像素的坐标为子块的第一列非第一行时,Ra与Rb等于b,Rc等于Ra在前一行时的重建值;当前像素的坐标为子块的最后一列时,Rb、Rd等于b的像素值,Ra、Rc等于a、c的像素值;在其他位置时,Ra、Rc、Rb、Rd依次等于a、c、b、d;(4.2)分为两个计算环节同时进行:索引值计算和像素预测像素预测:根据JPEG‑LS算法原理,通过上下文建模中Ra值、Rb值以及Rc计算出像素预测值Px,用寄存器输出;索引值计算:(4.2.1)根据上下文建模的结果计算三个梯度值:Rd与Rb相减得到梯度一D[0];Rb与Rc相减得到梯度二D[1];Rc与Ra相减得到梯度三D[2];(4.2.2)根据初始化得到的梯度量化阈值T1、T2、T3分别对三个梯度进行量化,具体处理方法为:将三个梯度值分别并行地与八个阈值‑T3、‑T2、‑T1、‑NEAR、NEAR、T1、T2、T3作比较,每个比较结果对应于8位的最终比较结果中的一位,三个梯度生成3个8bit的比较结果;即若梯度大于门限第i级门限,但小于或等于该级门限,则8bit的比较结果的0~i‑1位均为1,i~7位为0;(4.2.3)根据比较结果即可知道梯度位于哪个门限区间内,由此把该区间对应的量化值赋给量化结果即可得到三个量化结果Q_0,Q_1,Q_2;(4.2.4)梯度修正与符号判断:分别判断三个梯度量化值Q_0,Q_1,Q_2是否为负数,若三个量化值从左到右第一个不为0的数是负数,那么就把三个量化值的绝对值赋给三个梯度修正值Q0,Q1,Q2,同时符号标志SIGN等于‑1,否则直接把三个量化值依次赋给梯度修正值Q0,Q1,Q2,同时符号标志SIGN等于1,SIGN值用寄存器输出;(4.2.5)索引地址计算:把三个梯度值依Q0,Q1,Q2依次与81、9、1相乘,再把三个乘积相加,算出索引值Q,用寄存器输出至流水线下一级;同时,寄存器输出之前,索引值Q直接作用至“上下文参数RAM”,以数据伴随的有效信号为读使能,读出索引值Q所对应的A、B、C、N四个参数;(4.3)数据预处理:包含上下文参数C、N选择,预测值修正,残差计算,残差量化,像素重建,残差取模以及N参数更新;(4.3.1)索引值Q不经过任何计算直接用寄存器锁存一级输出至下一级,以供步骤4.4中使用;(4.3.2)上下文参数C、N选择:在步骤4.2中,索引值Q和数据有效信号作用于“上下文参数RAM”一周期后,参数A、B、C、N输出;根据“冲突控制”模块输出的“冲突指示信号”collosion,从步骤4.5回传的更新后的参数C_update、N_update和刚从“上下文参数RAM”读出的参数C、N当中进行选择,输出需要使用的参数C_sel、N_sel;当collosion为0时,选择从“上下文参数RAM”读出的参数C、N,而collosion为1时,选择从步骤4.5回传的更新后的参数C_update、N_update;参数选择采用组合逻辑实现;参数A和B不做任何计算,由寄存器锁存一级输出;(4.3.3)N参数更新:根据JPEG‑LS标准,使用符号标志SIGN与步骤“上下文参数C、N选择”所获取的参数N_sel进行N参数的更新,更新后得到N_update;当N参数进行更新时,若N_sel==RESET条件满足时,将N_flag置1,否则置0;根据JPEG‑LS标准,上下文参数更新时,N_sel==RESET这一条件的满足与否会影响参数A、B的更新选择,因此N_flag随N_update一起通过寄存器输出至下一级,以供上下文参数A、B、C更新时使用;N_sel也用寄存器输出至下一级;(4.3.4)预测值修正:根据JPEG‑LS标准,使用符号标志SIGN与步骤“上下文参数C、N选择”所获取的参数C_sel对预测值Px进行修正,获得预测修正值Px_c;(4.3.5)残差计算:根据JPEG‑LS标准,利用符号标志SIGN、当前像素值Ix与预测修正值Px_c运算获得残差值Errval;(4.3.6)残差量化:根据JPEG‑LS标准,对残差值Errval进行量化,得到残差量化值Errval_q;(4.3.7)像素重建:根据JPEG‑LS标准,通过符号标志SIGN、当前像素值Ix、残差量化值Errval_q以及近无损度参数Near值计算得到像素重建值Rx,再将像素重建值Rx反馈至上下文建模模块中,用来提供步骤4.1中当前像素上下文建模的环境模板;在无损压缩模式下,像素重建值Rx等于原像素值Ix;(4.3.8)残差取模:根据JPEG‑LS标准,利用残差取模范围RANGE对残差量化值Errval_q进行取模,使残差映射到取模范围内,得到残差取模值Errval_Mod,并用寄存器输出至下一级;(4.4)上下文参数更新,包含两个环节:上下文参数A、B选择,上下文参数A、B、C更新;(4.4.1)上下文参数A、B选择:根据“冲突控制”模块输出的“冲突指示信号”collosion,从步骤4.6回传的更新后的参数A_update、B_update和步骤4.3输出的参数A、B当中进行选择,输出需要使用的参数A_sel、B_sel;当collosion为0时,选择步骤4.3输出的参数A、B,而collosion为1时,选择从步骤4.6回传的更新后的参数A_update、B_update;参数选择采用组合逻辑实现;(4.4.2)上下文参数A、B、C更新:根据JPEG‑LS标准,使用残差取模值Errval_Mod,选择后的参数A_sel、B_sel、C_sel,以及步骤4.3中N参数更新后输出的N_flag信号,采用组合逻辑对上下文参数选择后获取的A、B、C参数进行更新计算,即每一个子块所对应的近无损度参数Near会伴随像素进入预测编码流水线中,根据当前使用的近无损度参数Near进行参数更新计算,得到更新的参数A_update、B_update、C_update,连同步骤4.3中输出过来的N_update一起,写入“上下文参数RAM”,伴随的数据有效信号作为RAM的“写使能”信号,步骤4.3中输出的索引值Q作为RAM的“写地址”;与此同时,A_update、B_update、C_update、N_update通过寄存器输出至下一级;筛选后的用来进行参数更新的三个参数A_sel、B_sel、N_sel和残差取模值Errval_Mod也通过寄存器输出至下一级,以供残差映射和K值计算使用;(4.5)包括主要的两个环节,即残差映射和K值计算;(4.5.1)步骤4.4.2中输出的C_update、N_update参数直接回传至步骤4.3参与预处理运算中的上下文参数C、N选择;A_update、B_update参数则直接经寄存器输出至步骤4.6;(4.5.2)残差映射:根据JPEG‑LS标准,使用残差取模值Errval_Mod,选择后的参数A_sel、B_sel计算出映射后的残差值MErrval,经寄存器输出至步骤4.6;(4.5.3)K值计算:JPEG‑LS标准中<img file="FDA0001127442970000061.GIF" wi="294" he="111" />实现方法为比较A与向左移位后的N,当A=N时,则K=0;当N<A≤(N<<1)时,则K=1;当(N<<1)<A≤(N<<2)时,则K=2;当(N<<2)<A≤(N<<3)时,则K=3……以此类推,用这种方式实现,可以减小计算复杂度,缩短计算延时;计算得到K值后,通过寄存器输出至步骤4.6;(4.5.4)预测编码中还有一个重要的环节,即“数据冲突控制”;将步骤4.2和步骤4.4中的索引值Q进行对比,生成对比结果:“冲突指示信号”collision;由于并行预测编码时,每一路的像素均相隔一个周期输入,因此,当两者相等时,表示相邻的两个像素使用的是“上下文参数RAM”中的同一个地址的参数,当前地址Q<sub>n</sub>像素刚进入“读参数”环节时,上一个Q<sub>n‑1</sub>对应像素的上下文参数已更新完毕,但还未写入到“上下文参数RAM”中,此时输出collision=1;当两者不相等时,表示相邻的两个像素使用的是“上下文参数RAM”中的不同地址的参数,当前像素需要使用最新的上下文参数时,可以直接访问“上下文参数RAM”,此时输出collision=0;collision伴随每一级的数据有效信号逐级传递,并分别作用于步骤4.2和步骤4.4中的上下文参数选择模块;(4.5.5)上下文参数RAM乒乓操作模块:为了防止误码扩散,对每个子块独立进行编码,因此每个子块的参数初始化和更新都是独立的,使用两组RAM;在当前子块做完进入下一子块的编码时需清除当前块对参数RAM的更新操作,使其回归初始值,即需要对参数RAM使用各参数的初始值进行初始化;由于A、B、C、N四个参数均为长度为365的数组,要完成初始化,需对365个RAM地址写入初始值;(4.6)将步骤4.5中传输过来的更新后的参数A_update、B_update回传给步骤4.4中,参与上下文参数A、B、C更新之前的上下文参数A、B选择;(5)以图像子块为单位,将两路预测编码结果并为一路输出;当两个预测编码模块进行预测编码后,将两路输出结果以子块为单位合并为一路输出至后续熵编码模块;预测编码模块1的将随流水线传递的近无损度参数Near、子块的首像素Fp、编码结果K值以及残差映射值MErrval拼位后一并写入到FIFO5中,而预测编码模块2的将随流水线传递的近无损度参数Near、子块的首像素Fp、编码结果K值以及残差映射值MErrval拼位后一并写入到FIFO6中;当FIFO5中写满一个子块的数目后,开始读FIFO5,读完一个子块数目的数据后转至FIFO6,同样等到输出完一个子块数目的数据后再跳转至FIFO6,按照此循环进行读取,使得预测编码结果可连续输出;(6)熵编码:Golomb编码(6.1)根据串行输出的K值,把串行输出的残差映射值MErrval右移K位,即把残差映射值除以2<sup>K</sup>,由此获得商值val;(6.2)用残差映射值MErrval减去商值val并左移K位的结果,由此获得残差映射值除以2<sup>K</sup>的余数n;(6.3)生成编码:如果计算出的商值val小于编码限长门限LMAX,则把数值1左移K位,在加上余数n即可生成编码,而把商值加上K,再加1即可得到编码长度,即val+K+1;若商值不小于编码限长门限LMAX,则把数值1右移像素位宽位,同时加上残差映射值MErrval,再减去1即可得到编码,而此时的编码长度为LIMIT;(6.4)编码拼接:根据编码长度,从LIMIT位的编码中提取有效编码,从高到低地拼接到64位的寄存器中,此处两个64位的寄存器配合各自的计数器乒乓地完成该工作;若其中一个64位的寄存器写满时就把它输出并清空,同时把编码拼到另一个寄存器中;(7)EDC(Error Detection and Correction)信息生成将各个编码长度进行累加,统计每个子块的编码总长,总长信息能保证区分开每一个子块对应的码流;将每个子块首像素Fp和编码总长以及该子块使用的近无损度参数Near拼位,生成EDC信息;EDC信息提供了解码所必需的相关信息;(8)码流整合与EDC信息插入:把生成的64位的码流通过FIFO转成16位后输出,每输出16个子块的码流,就把这16个子块的EDC信息插入到他们的码流之后,为保证可靠性,每个块的EDC信息都要复制三份16块为一组地插入到码流中,三份之间两两相隔16个子块的码流,即每输出16块的编码之后,除了要插入当前16个子块的EDC信息,还要把其前两组16个子块的EDC信息插一遍,如此确保每个子块的EDC信息倒在码流中插了3份;(9)检纠错编码:根据参数检纠错模式来选通使用的检纠错模式,RS编码或者屏蔽检纠错编码:(9.1)若选通RS编码模式,则对生成的插入EDC信息的混合码流,每223byte信息码,生成32byte校验码并插入到该223byte信息码之后,以此生成抗误码码流;(9.2)若选通屏蔽检纠错编码模式,则不进行检纠错编码,直接将生成的插入EDC信息的混合码流输出;(9.3)选择RS检纠错编码可以防止一定程度的信道误码,但是会造成压缩比的损失,如果通信信道误码率低,为了提高压缩比,可以选择屏蔽检纠错编码;(10)码流组帧:在一幅图像的码流的起始端加入帧头识别字段和相关编码信息,编码信息包括子块大小,图像大小,图像像素位宽,检纠错编码模式以及近无损度参数,在码流的结尾加入帧尾识别字段,输出生成的编码码流。
地址 430074 湖北省武汉市洪山区珞喻路1037号