1.算法描述
图像压缩的类别
对于图像压缩,主要有两类方法:无损的图像压缩以及有损的图像压缩,分别称为lossless image compression and lossy image compression。
对于无损的图像压缩方法,压缩的图像必须是原图像的精准的复制,这种的方法主要用于医学影像等方面,稍微一点的图像损失就会带来较大的风险(比如说错误的医学诊断)。
而有损的图像压缩则更为常见,其主要目的是均衡重建图像的质量以及提高压缩比。
图像的数字表示 Digital Representation of Images
通常的图像可以被定义为2-D的函数f(x,y), 其中x,y为空间坐标,f的幅值被称为亮度/强度或灰度(brightness, intensity, grey level)。 对于我们常见的图像,可以用矩阵MN表示,每个点有各自的像素值,该像素值用无符号的8bit整数表示,范围为0-255,即我们通常所说的8bit位宽的M*N的图像。同样的对于彩色图像,可以由三个这样的矩阵来表示(RGB, HSV, YUV等),那么此时为24bit的彩色图。
数字图像压缩 Digital Image Compression
一张图像之所以可以被压缩,有着以下几方面的原因:
- 对于单张图像来说,在邻近的像素之间有着大量的相关性/冗余,称之为空间冗余。因为通常来说,邻近的像素点基本会拥有较为相近的像素值。
- 对于从多个sensor获得的数据,各自存在着一定的相关性。
因此,图像压缩方法就是利用了图像中存在的这些冗余性从而得以实现的。图像压缩系统通常分为两部分:压缩以及解压缩(compressor , decompressor)。对于compressor:通常分为预处理以及编码阶段(preprocessing stage and encoding stage);其中,前处理可以进行一些灰度值/空间域的量化;或者是去噪等。在压缩阶段,可以先将图像进行转换至其它的数学空间,使得其可以更容易的进行压缩(比如说转换到YUV空间,或者是DCT变换等)。接下来是量化阶段,将一些连续的数值转换成离散的形式。
最后的阶段是编码的部分。将得到的数据进行编码后传输。而对于decompressor:通常分为解压缩以及后处理阶段(decoding stage and postprocessing stage).在解压缩阶段,首先做编码对应的解码, 再进行反量化, 以及反向的图像空间域的转换。其过程与compressor里的是一一对应的。其中,后处理可以来减少在压缩过程中产生的一些伪影等。
小波变换(wavelet transform,WT)是一种新的变换分析方法,它继承和发展了短时傅立叶变换局部化的思想,同时又克服了窗口大小不随频率变化等缺点,能够提供一个随频率改变的“时间-频率”窗口,是进行信号时频分析和处理的理想工具。它的主要特点是通过变换能够充分突出问题某些方面的特征,能对时间(空间)频率的局部化分析,通过伸缩平移运算对信号(函数)逐步进行多尺度细化,最终达到高频处时间细分,低频处频率细分,能自动适应时频信号分析的要求,从而可聚焦到信号的任意细节,解决了Fourier变换的困难问题,成为继Fourier变换以来在科学方法上的重大突破。
2.仿真效果预览
matlab2022a仿真结果如下:
3.MATLAB核心程序
clear;
close all;
warning off;
addpath(genpath(pwd));
orimg=imread('lena.bmp');
imshow(orimg);
title('原始图象');
orimage=double(orimg);
tImg=wavelet('2D D5',1,orimage,'sym');
tImage=uint8(tImg);
figure;
imshow(tImage);
Img=zeros(512,512);
Img(1:256,1:256)=tImg(1:256,1:256);
[Image,sc,dmatrix]=double2uint(Img);
x=select(Image);
code=RLC(x);
%%%%%%%%%%%%%%%%%%%解码部分%%%%%%%%%%%%%%%%%%
Image=dec(code);
Image_r=uint2double(Image,sc,dmatrix);
IImg=wavelet('2D D5',-1,Image_r,'sym');
IImg=uint8(IImg);
figure;imshow(IImg);
title('恢复图象');
diff=orimg-IImg;
figure;imshow(diff);
e=sum(sum(diff))/(sum(sum(orimg)));
total_infor=512*512;
[code_r,code_c]=size(code);pp=(512*512)/code_c;
disp(['压缩前的图像信息大小为:',int2str(total_infor)]);
disp(['压缩后的图像信息大小为:',int2str(code_c)]);
disp(['压缩率为:',num2str(pp),':1']);
disp(['压缩误差为:',num2str(e)]);
A116