图像压缩所解决的主要问题是尽量减少表示数字图像时所需要的数据量。减少数据量的基本原理是去除其中多余的数据。本博客将给定的图像进行压缩处理,使Huffman编码方法,并计算压缩比,分析图像压缩后的视觉效果。
文章目录
- 一、主要设计思想
- 二、实现算法及程序流程图
- 三、源程序
- 四、主要技术问题的处理方法
- 五、实验结果及分析
一、主要设计思想
首先将彩色图像灰度化,转化为单通道灰度图像。然后对每个像素对应的灰度级进行统计,以及对应的编码记录存放在像素数组中,接着把像素数组中的灰度像素个数从大到小进行排序,建立Huffman解码矩阵计算出灰度级最小两位像素个数的和,对图像灰度统计数据按Huffman算法编码,输出图像前通过解码矩阵对图像进行解码,最后,输出解码后的图像与原图相对比并计算图像压缩比。
二、实现算法及程序流程图
三、源程序
I=imread('D:/pic/baby.jpg');% 读取测试图像I =rgb2gray(I);% 转化为灰度图像[m,n]=size(I);len=m*n;S = zeros(1,256);In = I(:);% 获取各符号的概率for p=0:255;j=find(i==p-1);S(p+1)=length(j)/(len);endt = 0:255;dict = huffmandict(t,S); %生成字典enco = huffmanenco(In,dict); %编码deco = huffmandeco(enco,dict); %解码Ide = col2im(deco,[m,n],[m,n],'distinct'); %把向量重新转换成图像块;subplot(1,2,1);imshow(I);title('原始图像');subplot(1,2,2);imshow(uint8(Ide));title('压缩后的图像');fprintf("图像的压缩比: %f\n", 1-size(enco)/8/size(deco)) %将编码后的数值看作二进制后进行计算
四、主要技术问题的处理方法
对一般尺寸的彩色图像,输入的图像是维数阶数较高的矩阵,按照Huffman编码的计算方法耗时会长,所以先将图像转化为单通道灰度图像,这样就不用对R、G、B三个通道进行处理。在视觉效果上两幅图像基本看不出差别,但是运算速度不够理想。
五、实验结果及分析
图像的压缩比:0.142416
从RGB三通道转化为单通道灰度图像,速度有提升,但不明显。Huffman算法是无损压缩,解码效果来看,两幅图像基本无差别。但是运算速度不够理想,按照Huffman编码这种统计算法耗时比较长,算法有待进一步改进。