JPEG标准的Huffman表是通过两个步骤从统计数据集中生成的。其中一个步骤是实现该图片给出的功能/方法:(该图片在JPEG标准的附录K中给出):
问题在这里。以前在标准(附件C)中说这句话:
霍夫曼表是根据16字节列表(BITS)指定的,给出了每个代码长度的代码数量 这之后是一个8位符号值列表(HUFFVAL),每个符号值都分配了一个霍夫曼码。
显然BITS
是16个元素的列表。但在上图中,i
首先设置为32(i=32
),然后我们想要访问BITS[i]
。可能我误解了一些东西,所以请让别人给我一个答案。
这是图片的JPEG标准说明: 图K.3 给出了调整BITS列表的过程,使得代码不超过16位。由于符号是配对的 对于最长的霍夫曼代码,一次从该长度类别中删除符号。该对的前缀 (它短一位)被分配给一对;然后(跳过该前缀长度的BITS条目)一个代码字 从下一个最短的非零BITS条目转换为两个代码字的前缀一个长一点。在BITS之后 list减少到16位的最大代码长度,最后一步从代码长度中删除保留的代码点 计数。
以下是上图的代码:
void adjustBitLengthTo16Bits(vector<char>&BITS){
int i=32,j=0;
while(1){
if(BITS[i]>0){
j=i-1;
j--;
while(BITS[j]<=0)
j--;
BITS[i]=BITS[i]-2;
BITS[i-1]=BITS[i-1]+1;
BITS[j+1]=BITS[j+1]+2;
BITS[j]=BITS[j]-1;
continue;
}
else{
i--;
if(i!=16)
continue;
while(BITS[i]==0)
i--;
BITS[i]--;
return;
}
}
}
答案 0 :(得分:3)
此代码仅适用于想要生成自己的自定义Huffman表的编码器。大多数JPEG编码器只使用固定表,这些表是大多数图像统计数据的合理近似值。在这种特定情况下,为AC系数生成霍夫曼表的第一步产生最多32个条目(比特)长的表。由于只有256个唯一符号要编码(跳过/长度对),因此指定所有霍夫曼码所需的时间不应超过32位。在第一次传递产生一组代码(长度最多为32位)之后,第二次传递采用最不频繁(最长)的代码并将它们“移动”到较短的长度时隙中,以使最大代码长度为16位。在理想的霍夫曼表中,频率分布对应于代码长度。在这种情况下,通过将最长的代码压缩到为较短代码保留的时隙中来使表适合。这可以做到,因为14/15/16位长度的霍夫曼码具有更多比特排列的“空间”,并且可以“适应”更长的码。
更新: 在JPEG中“优化”霍夫曼表是有限的好处。大多数压缩是由于像素的量化和DCT变换而发生的。切换到算术编码具有可测量的好处(大小减少约10%),但随后它限制了受众,因为大多数JPEG解码器由于过去的专利问题而不支持算术编码。