文章结构
图像处理系列笔记: https://blog.csdn.net/qq_33208851/article/details/95335809
【前言】
图像的每个像素用不同的灰度级来表示,在计算机中进行编码,然后使用0和1的01串来进行存储和传输等。本文将介绍数字图像中的各种编码格式。
平均编码长度(Average length):
注:下文中出现的符号一词与灰度值等同
1. B编码
B编码中每个码字由延伸比特C和信息比特组成,延伸比特的作用是实现码字分隔。延伸比特C的一般取值为0和1。两个相邻的码字通过延伸码C的不同取值(0和1)来区分,同一个码字中C的值是相同的(见下例)。
- 【注】什么叫码字?
例如0和1的编码分别是C0和C1,那么C0是一个码字,同样的,C1也是一个码字
编码的步骤:
例如:
说明:
- 在编码时候需要先对灰度级出现的概率(根据直方图)做出按从高到低的排序(上图中灰度级的顺序0,1,2,3,4,5,6只是偶然)然后再进行编码(灰度级出现概率大的编码 长度小,反之,灰度级概率小的编码的长度大)
- B1就是B编码
- B1编码格式中,每个码字的一个小元素由C+一位信息比特组成,最少为C0或C1,之后是C0C0,C0C1,…,C1C1,然后是C0C0C0,…,C1C1C1.
- C从0开始或者从1开始都可以,只要每两个相邻的码字C的取值不同即可(0和1换着取)。注意同一个码字中的C的取值是相同的。
- 在解码时,去掉C的信息(不管C,C的作用只是为了区分不同的码字),得到信息比特的信息。然后参照编码表进行解码。比如0001取出信息部分是01,对应这编码表中的C0C1,那么0001解码后得到3.同样的,1011取出信息比特也是01.
2. B2编码
说明:
- B2编码格式中,每个码字的一个小元素由C+2位信息比特组成,最少为C00或C01,之后是C00C00,C00C01,…,C11C11,然后是C00C00C00,…,C11C11C11.
- C从0开始或者从1开始都可以,只要每两个相邻的码字C的取值不同即可(0和1换着取)。注意同一个码字中的C的取值是相同的。
- 在解码时,去掉C的信息(不管C,C的作用只是为了区分不同的码字),得到信息比特的信息。然后参照编码表进行解码。比如110取出信息部分是10,对应这编码表中的C10,那么110解码后得到2.同样的,010取出信息比特也是10.
3. Huffman编码
例:
需要注意的问题:
- 截尾霍夫曼编码(Truncated Huffman):
当信源发出的符号类型较多时,编码的过程可能较繁琐,利用截尾霍夫曼编码可以降低编码的复杂性,代价是编码效率的降低。截尾霍夫曼编码是通过对信洚的具有最大概率的n个符号进行霍夫曼编码产生的,n是小于J 的正整数.其它的概率较小的符号利用前缀编码和适当的固定长度编码表示.
对Truncated Huffman一列的说明: - a1 ~a21是按照出现概率从高到低进行排好序的
- Truncated Huffman的平均长度是4.24,Huffman只有1.05,但Truncated Huffman带来的是编码效率的提升
- 概率出现最小的9个(a13~ a21)之和为0.2,记为a。将a与之前的a1 ~a12进行霍夫曼编码,这个a的编码为10。但是这个a中还有9个需要进行区分,9是介于23 ~24之间,所以至少需要4位才能将这9个进行区分。下面进行的工作是将(a13 ~ a21)进行二进制编码,然后高位拼接上10,结果如表中所示。如果高位是10,说明这个编码是a中的某一个(a13~ a21)。
4. 移位码(S码)
这种移位码是自然的二值移位码
例子:
说明:
- 在本例中,n=2。所以将按照出现概率从高到低排好序的符号(这里指的是灰度值)分块:22-1=3,即三个灰度级作为一个块。这里分块的结果是;0,1,2作为第一个块,3,4,5作为第二个块。
- 然后对块进行编码:第一个块不需要在前面添加移位码字,对;0,1,2进行自然二进制编码,结果如表中所示。然后是对第二个块进行编码:第二个块需要在前面添加一组移位码字,添加的码字是第一组中没有使用的11.然后同样的对第二个块内的3个符号(灰度级)进行自然二进制编码,两者拼接就是第二个块的编码结果,如表中所示。
例子:
这里n=3,每一块 中后面的3位是对应相等的,如a2,a9和a16的001.其他同理不再赘述
5. 霍夫曼移位编码(Huffman Shift)
将自然二值移位码与霍夫曼编码相结合得到另一种新的编码方式, 霍夫曼移位编码(Huffman Shift)。
霍夫曼移位码与自然二值移位码的区别是
- 分块的大小不一定是2n-1
- 基准块中符号和移位符号的编码不是采用自然二进制编码,而是使用霍夫曼编码.这意味着对基准块进行编码之前要分配移位符号的概率.
两种分配概率二点方法:
1.移位符号的概率=非基准块中符号的概率和
2.移位符号的概率=第二块中符号的概率和+2 x第三块中符号的概率和+ 3x第四块中符号的概率和+…
例子:
说明:
- 这里n=3,分为3块,每一块7个
- 每一块后面的几位是对应相等的
- 第二块前面的移位码是一组00,第三块前面的移位码是两组00(00 00)
- 移位符号00是如何确定的?这里是通过计算非基准块(除了第一块的其他块叫非基准块)中符号的概率和(=1-基准块中符号的概率和)=1-0.61=0.39。然后用0.39(记为a)与a1 ~a7一共8个进行霍夫曼编码,最终得到的a的编码是00(因为0.39这个概率比a1 ~a7中任何一个的概率都要大,所以得到的编码结果是00也在情理之中。注:概率越大编码长度越短,对应的值越小)
6. 算数编码
算术编码是一种非块码,信源符号(灰度值)和码字之间不存在一一对应的关系。
算术编码是给整个信源符号(或消息)序列分配 一个单一的算术码字。这个码字本身定义了一 个介于0和1之间的实数。
因为这种技术不像霍夫曼编码方法那样要求将每个信源符号转换成整数的编码(即,每次对一个符号进行编码),所以这种技术达到了 (仅在理论上)由无噪声编码准則所设定的界限。
算术编码用到的两个基本的参数:符号的概率和它的编码间距。
参照以下例子:
译码的过程:
7. 词典编码
词典编码不需要了解有关被编码符号的出现的概率。
词典编码的根据是数据本身包含有重复代码这个特性。例如文本文和图像就具有这种特性。
词典编码法的种类很多,归纳起来大致有两类
- 第一类
第一类词典编码的想法是企图查找正在压缩的字符序列是否在以前输入的数据中出现过,然后用己经出现过的字符串替代重复的部分,它的输出仅仅是指向早期出现过的字符串的“指针”。这一类词典编码所指的“词典”是指用以前处理过的数据来表示编码过程中遇到的重复部分。
- 第二类
第二类算法的想法是企图从输入的数据中创建一个“短语词典”,这种短语不一定是具有具体含义的短语,它可以是任意信源符号的组合.编码数据过程中当遇到己经在词典中出现的“短语”时,编码器就输出这个词典中的短语的“索引号”,而不是短语本身
LZW编码(属于第二类的词典编码):
对信号源的可变长度序列分配固定长度的码字,不需要了解被编码符号的出现的概率