关于图像处理:Matlab实现图像压缩

12次阅读

共计 5412 个字符,预计需要花费 14 分钟才能阅读完成。

文章和代码以及样例图片等相干资源,曾经归档至【Github 仓库:digital-image-processing-matlab】或者公众号【AIShareLab】回复 数字图像处理 也可获取。

目标

1. 了解图像压缩的相干概念及图像压缩的次要准则和目标;
2. 把握霍夫曼编码
3. 把握几种常见的图像压缩编码方法
4. 利用 MATLAB 程序进行图像压缩

原理

图像压缩原理

图像压缩次要目标是为了节俭存储空间,减少传输速度。图像压缩的现实规范是信息失落起码,压缩比例最大。不损失图像品质的压缩称为无损压缩,无损压缩不可能达到很高的压缩比;损失图像品质的压缩称为有损压缩,高的压缩比是以就义图像品质为代价的。压缩的实现办法是对图像从新进行编码,心愿用更少的数据表示图像。

信息的冗余量有许多种,如空间冗余,工夫冗余,构造冗余,常识冗余,视觉冗余等,数据压缩本质上是缩小这些冗余量。高效编码的次要办法是尽可能去除图像中的冗余成分,从而以最小的码元蕴含最大的图像信息。

编码压缩办法有许多种,从不同的角度登程有不同的分类办法,从信息论角度登程可分为两大类。

(1)冗余度压缩办法,也称无损压缩、信息放弃编码或嫡编码。具体说就是解码图像和压缩编码前的图像严格雷同,没有失真,从数学上讲是一种可逆运算。

(2)信息量压缩办法,也称有损压缩、失真度编码或烟压缩编码。也就是说解码图像和原始图像是有差异的,容许有肯定的失真。

利用在多媒体中的图像压缩编码方法,从压缩编码算法原理上能够分为以下 3 类:

(1)无损压缩编码品种
哈夫曼(Huffman)编码,算术编码,行程(RLE)编码,Lempel zev 编码。

(2)有损压缩编码品种

  • 预测编码,DPCM,静止弥补
  • 频率域办法:正交变换编码(如 DCT),子带编码;
  • 空间域办法:统计分块编码;
  • 模型办法:分形编码,模型基编码;
  • 基于重要性:滤波,子采样,比特调配,向量量化;

(3)混合编码。有 JBIG,H261,JPEG,MPEG 等技术标准。

离散余弦变换 (DCT) 图像压缩原理

离散余弦变换 DCT 在图像压缩中具备宽泛的利用,它是 JPEG、MPEG 等数据压缩规范的
重要数学根底。

和雷同图像品质的其余罕用文件格式 (如 GIF(可替换的图像文件格式),TIFF(标签图像文件格式),PCX(图形文件格式)) 相比,JPEG 是目前动态图像中压缩比最高的。JPEG 比其余几种压缩比要高得多,而图像品质都差不多(JPEG 解决的图像只有真彩图和灰度图)。正是因为其高压缩比,使得 JPEG 被宽泛地利用于多媒体和网络程序中。JPEG 有几种模式,其中最罕用的是基于 DCT 变换的程序型模式,又称为根本零碎(Baseline)。

用 DCT 压缩图像的过程为:

(1)首先将输出图像合成为 8×8 或 16×16 的块,而后对每个子块进行二维 DCT 变换。
(2)将变换后失去的量化的 DCT 系数进行编码和传送,造成压缩后的图像格式。

用 DCT 解压的过程为:

(1)对每个 8×8 或 16×16 块进行二维 DCT 反变换。
(2)将反变换的矩阵的块合成一个繁多的图像。

余弦变换具备把高度相干数据能量集中的趋势,DCT 变换后矩阵的能量集中在矩阵的
左上角,右下的大多数的 DCT 系数值十分靠近于 0。对于通常的图像来说,舍弃这些靠近
于 0 的 DCT 的系数值,并不会对重构图像的画面质量带来显著的降落。所以,利用 DCT
变换进行图像压缩能够节约大量的存储空间。压缩应该在最正当地近似原图像的状况下应用
起码的系数。应用系数的多少也决定了压缩比的大小。

在压缩过程的第 2 步中,能够正当地舍弃一些系数,从而失去压缩的目标。在压缩
过程的第 2 步,还能够采纳 RLE 和 Huffman 编码来进一步压缩。

行程编码(RLE)原理

例如如下这幅的二值图像,

如果采纳行程编码能够按如下格局保留

其中 10 和 8 示意图像的宽和高。在这个小例子中行程编码并没有起到压缩图像的作用。这是因为这个图的尺寸过小,当图像尺寸较大时行程编码还是不错的无损压缩办法。对于灰度图像和二值图像,用行程编码—般都有很高的压缩率。行程编码方法实现起来很容易,对于具备长反复值的串的压缩编码很无效,例如:对于有大面积的暗影或色彩雷同的图像,应用这种办法压缩成果很好。很多位图文件格局都采纳行程编码,如 TIFF,PCX,GEM,BMP 等。

步骤

MATLAB 中的变长码映射

clear all
clc


f2=uint8([2 3 4 2;3 2 4 4;2 2 1 2;1 1 2 2])
whos('f2')
c=huffman(hist(double(f2(:)),4))
h1f2=c(f2(:))'whos('h1f2')
%h2f2=char(h1f2)'h2f2=[1 0 1 0 0 1 1 0 0 0 0 1 1 0 1 1;...' '1' '1 1' '1 0 0 1' '0' ';...' '0' '1 0' '1' '1' ']
whos('h2f2')

h2f2=h2f2(:);
h2f2(h2f2==' ')=[];
whos('h2f2')

h3f2=mat2huff(f2)
whos('h3f2')

hcode=h3f2.code;
whos('hcode')
dec2bin(double(hcode))

%-----------------------------------------%
function CODE=huffman(p)

error(nargchk(1,1,nargin));
if(ndims(p)~=2)|(min(size(p))>1)|~isreal(p)|~isnumeric(p)
    error('p must be a real numeric vector');
end

global CODE
CODE=cell(length(p),1);%init the global cell array
if (length(p)>1) %when more than one symbol....
    p=p/sum(p);%Normalize the input probabilities
    s=reduce(p);%Do Huffman source symbol reductions
    makecode(s,[]);%Recursively(递归) generate the code
else
    CODE={'1'};%else, trivial(一般的) one symbol case
end;
%---------------------------------------------------------%

function s=reduce(p);
s=cell(length(p),1);
for i=1:length(p)
    s{i}=i;
end

while size(s)>2
    [p,i]=sort(p);%sort the symbol probabilities
    p(2)=p(1)+p(2);%Merge the 2 lowest probabilities
    p(1)=[];% and prune(, 剪除、删除) the lowest one

    s=s(i);
    s{2}={s{1},s{2}};
    s(1)=[];
end
%------------------------------------------------------------%
function makecode(sc,codeword)

global CODE
if isa(sc,'cell')
    makecode(sc{1},[codeword 0]);
    makecode(sc{2},[codeword 1]);
else
    CODE{sc}=char('0'+codeword);
End
%-----------------------------------------------------------%
function y=mat2huff(x)

if ndims(x)~=2|~isreal(x)|(~isnumeric(x) & ~islogical(x))
    error('x must be a 2-D real numeric or logical matrix');
end

y.size=uint32(size(x));
x=round(double(x));
xmin=min(x(:));
xmax=max(x(:));
pmin=double(int16(xmin));
pmin=uint16(pmin+32768);%
y.min=pmin;
x=x(:)';
h=histc(x,xmin:xmax);
if max(h)>65535
    h=65535*h/max(h);
end
h=uint16(h);
y.hist=h;

%code the input matrix and store the result
map=huffman(double(h));
hx=map(x(:)-xmin+1)
hx = ['1' '''1''0' '''1''1' '0' ''' '...'0''1' '1' '''1''1']';
%hx=char(hx);
hx=hx(:)';
hx(hx==' ')=[];
ysize=ceil(length(hx)/16);
hx16=repmat('0',1,ysize*16);
hx16(1:length(hx))=hx;
hx16=reshape(hx16,16,ysize);
hx16=hx16'-'0';
twos=pow2(15:-1:0);
y.code=uint16(sum(hx16.*twos(ones(ysize,1),:),2))';
%-----------------------------------------------------------------------%

离散余弦变换(DCT)图像压缩

在图像的变换和压缩中,经常用到离散余弦变换(DCT)。DCT 具备能使图像的最重要的信息集中在 DCT 的几个系数上的性能。正是基于此,DCT 通常利用于图像的压缩。

clear all
clc
I=imread('D:\pic\DIP3E_CH11_Original_Images\Fig1137(b)(painting_translated_padded).tif','tif');

I=im2double(I);
T=dctmtx(8);
B=blkproc(I,[8,8],'P1*x*P2',T,T');
mask=[1 1 1 1 0 0 0 0;1 1 1 0 0 0 0 0;1 1 0 0 0 0 0 0;...
        1 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0;...
        0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0];
B2=blkproc(B,[8,8],'P1.*x',mask);
I2=blkproc(B2,[8,8],'P1*x*P2',T',T);
imshow(I),title('原图象');
figure,imshow(I2),title('变换后的图象');

利用离散余弦变换进行 JPEG 图像压缩

clear all
clc
I=imread('D:\pic\DIP3E_CH11_Original_Images\Fig1137(b)(painting_translated_padded).tif'); % 读入原图像;I=im2double(I); % 将原图像转为双精度数据类型;T=dctmtx(8); % 产生二维 DCT 变换矩阵
B=blkproc(I,[8 8],'P1*x*P2',T,T'); % 计算二维 DCT,矩阵 T 及其转置 T’是 DCT 函数
%P1*x*P2 的参数
mask=[ 1 1 1 1 0 0 0 0;1 1 1 0 0 0 0 0;1 1 0 0 0 0 0 0;1 0 0 0 0 0 0 0;...
    0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0];
% 二值掩膜,用来压缩 DCT 系数,只留下 DCT 系数中左上角的 10 个
B2=blkproc(B,[8 8],'P1.*x',mask); % 只保留 DCT 变换的 10 个系数
I2= blkproc(B2,[8,8],'P1*x*P2',T',T); % 逆 DCT,重构图像
Subplot(1,2,1);
Imshow(I);title('原图像');% 显示原图像
Subplot(1,2,2);
Imshow(I2);title('压缩图像');% 显示压缩后的图像。比照原始图像和压缩后的图像,尽管
% 舍弃了 85% 的 DCT 系数,但图像依然清晰(当然有一些品质损失)

参考文献:

[1] Rafael C. Gonzalez, Richard E. Woods, and Steven L. Eddins. 2003. Digital Image Processing Using MATLAB. Prentice-Hall, Inc., USA.

[2] [阮秋琦. 数字图像处理(MATLAB 版)[M]. 北京:电子工业出版社, 2014.](https://github.com/timerring/digital-image-processing-matlab/blob/main/reference/Digital_Image_Processing_(MATLAB_version).pdf)

[3] [冈萨雷斯. 数字图像处理(第三版)[M]. 北京:电子工业出版社, 2011.](https://github.com/timerring/digital-image-processing-matlab/blob/main/reference/Digital_Image_Processing_(Third_Edition).pdf)

正文完
 0