利用DCT进行jpg压缩;对图像进行二值化【matlab代码】

一、任务及目标

在远程抄表系统中,需要将采集的图像远距离传输以供抄表人观看,由于距离远和控制成本的问题,不能采用较高速度的波特率进行传输,需要将采集到的图像进行压缩后传输,给出合理的解决方案。
1.1学习DCT及jpg压缩原理,通过matlab仿真,利用DCT进行jpg压缩;
1.2通过matlab仿真,对图像进行二值化,利用二值图像压缩方法进行数据压缩,然后进行解压缩,看通过肉眼能否看清汽车牌照;
1.3比较DCT和二值化两种算法的压缩效果;

二、原理及设计方案

2.1利用DCT进行jpg压缩

利用DCT进行jpg压缩;对图像进行二值化【matlab代码】

2.1.1颜色空间转换

在读取图片时采用RGB三基色信号,然后转换为YUV彩色模型的图像便于后续压缩、增强、恢复,此时如果只有Y信号分量而没有U、V分量,则为黑白灰度图。最后还原成RGB三基色信号。转换公式如下所示:
RGB转换为YUV:
利用DCT进行jpg压缩;对图像进行二值化【matlab代码】

YUV转换为RGB:

利用DCT进行jpg压缩;对图像进行二值化【matlab代码】

2.1.2分块

后续的DCT变换是基于8×8大小的像素块,因此一个数字图像在DCT之前需要进行分块。但是一个图像的分辨率中长宽不一定都是8的倍数,此时需要对之边缘补成8的倍数然后进行分块。由于图像的YUV三个分量是交替出现的,首先需要将YUV三个分量分开存入3张表中;然后依次从左到右,从上到下,读取8×8的子块,存放到64长度的表中。

2.1.3离散余弦变换DCT

DCT是先将原M×N的图像进行分块,然后在逐一的进行DCT。DCT变换是在最小均方误差准则下得出的次最佳正交变换,
利用DCT进行jpg压缩;对图像进行二值化【matlab代码】

2.1.4量化

量化就是用像素值÷量化表对应值(量化步长)所得的结果。由于量化表左上角的值较小,右上角的值较大,这样就起到了保持低频分量,抑制高频分量的目的。对Y采用细量化,对UV采用粗量化。

2.1.5编码

编码前先进行Z字形扫描排序,把二维变换的变换系数矩阵转换为一维序列,保证数列里的相邻点在图片上也是相邻的。
利用DCT进行jpg压缩;对图像进行二值化【matlab代码】
JPEG的基本系统的熵编码采纳了平均压缩比最高的编码哈夫曼编码,其理论依据是变字长编码理论。在变字长编码中,编码器的编码输出码字是长度不等的码字,按照编码输入信息符号出现的统计概率,给输出码字分配不同的字长,出现概率极高的分配较短的码字,反之出现概率较低的则分配较长的码字,从而得到较好的压缩效果。

2.2对图像进行二值化

图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。
利用DCT进行jpg压缩;对图像进行二值化【matlab代码】对图像进行二值化的难点在于二值化阈值的确定,若是直接通过graythresh()确定阈值,但是常常会出现较大偏差,因此选用迭代阈值最佳算法求最佳阈值。

利用DCT进行jpg压缩;对图像进行二值化【matlab代码】

2.3比较DCT和二值化两种算法的压缩效果

压缩比=压缩前的所占字节数/压缩后的所占字节数

三、具体步骤及结果

3.1利用DCT进行jpg压缩

1)采用RGB三基色信号读取图片:

RGB=imread('1.jpg');
R=RGB(:,:,1);
G=RGB(:,:,2);
B=RGB(:,:,3);

2)转换为YUV彩色模型图像

Y=0.299*double(R)+0.587*double(G)+0.114*double(B);
U=-0.169*double(R)-0.3316*double(G)+0.5*double(B);  
V=0.5*double(R)-0.4186*double(G)-0.0813*double(B);

3)将原始图像数据分成8×8小块

T=dctmtx(8);
BY=blkproc(Y,[8 8],'P1*x*P2',T,T');  
BU=blkproc(U,[8 8],'P1*x*P2',T,T');  
BV=blkproc(V,[8 8],'P1*x*P2',T,T'); 

4)离散余弦变换并进行量化,主要代码如下

a= [16 11 10 16 24 40 51 61;  
    12 12 14 19 26 58 60 55;  
    14 13 16 24 40 57 69 55;  
    14 17 22 29 51 87 80 62;  
    18 22 37 56 68 109 103 77;  
    24 35 55 64 81 104 113 92;  
    49 64 78 87 103 121 120 101;  
    72 92 95 98 112 100 103 99;];  %量化值  
  b=[ 17 18 24 47 99 99 99 99;  
      18 21 26 66 99 99 99 99;  
      24 26 56 99 99 99 99 99;  
      47 66 99 99 99 99 99 99;  
      99 99 99 99 99 99 99 99;  
      99 99 99 99 99 99 99 99;  
      99 99 99 99 99 99 99 99;  
      99 99 99 99 99 99 99 99;]; 
BY2=blkproc(BY,[8 8],'x./P1',a); 
BU2=blkproc(BU,[8 8],'x./P1',b);  
BV2=blkproc(BV,[8 8],'x./P1',b); 
BY3=int8(BY2); 
BU3=int8(BU2);  
BV3=int8(BV2);  
BY4=blkproc(double(BY3),[8 8],'x.*P1',a);
BU4=blkproc(double(BU3),[8 8],'x.*P1',b); 
BV4=blkproc(double(BV3),[8 8],'x.*P1',b);

mask=[   1  1  1  1  1  0  0  0;  
         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;]; 
BY5=blkproc(BY4,[8 8],'P1.*x',mask); 
BU5=blkproc(BU4,[8 8],'P1.*x',mask);  
BV5=blkproc(BV4,[8 8],'P1.*x',mask); 

YI=blkproc(double(BY5),[8 8],'P1*x*P2',T',T);
UI=blkproc(double(BU5),[8 8],'P1*x*P2',T',T);  
VI=blkproc(double(BV5),[8 8],'P1*x*P2',T',T);  

5)将YUV转换为RGB三基色信号

RI=YI-0.001*UI+1.402*VI;  
GI=YI-0.344*UI-0.714*VI;  
BI=YI+1.772*UI+0.001*VI; 

6)编码解码
直接调用函数,主要代码如下:

P = zeros(1,256);	%获取各符号的概率;
k = 0:255;
 	dict = huffmandict(k,P); %生成字典
 	enco = huffmanenco(I1,dict); %编码
 	deco = huffmandeco(enco,dict); %解码
 	Ide = col2im(deco,[M,N],[32,115],'distinct'); %把向量重新转换成图像块;

3.2对图像进行二值化

1)设置所需参量

[x,y]=size(I);   % 求出图象大小
b=double(I);                                   
z0=max(max(max(I)));   % 求出图象中最大的灰度
z1=min(min(min(I)));     % 最小的灰度 
T=(z0+z1)/2;          % T赋初值,为最大值和最小值的平均值
TT=0;                %TT赋初值
S0=0.0; n0=0.0;  %为计算灰度大于阈值的元素的灰度总值、个数赋值
S1=0.0; n1=0.0;  %为计算灰度小于阈值的元素的灰度总值、个数赋值
allow=50;        % 新旧阈值的允许接近程度
d=abs(T-TT);
count=0;         % 记录几次循环

2)迭代阈值最佳算法求最佳阈值:
通过假设阈值T来分割图像为两部分,对各个部分求取均值T0与T1假设新的阈值TT= (T0+T1)/2 不等于T则令T= TT然后继续迭代直到两者相等。代码如下:

while(d>=allow)    
    	count=count+1;
   	 for i=1:x,
       	 for j=1:y,
           	 if I(i,j)>=T,
              	  S0=S0+b(i,j);     
               	 n0=n0+1;
          	  end
           	 if I(i,j)<T,
            	    S1=S1+b(i,j);
             	   n1=n1+1;
         	   end
      	  end
   	 end 
   	 T0=S0/n0;
    	T1=S1/n1;
  	    TT=(T0+T1)/2;           %在阈值T下,迭代阈值的计算过程
   	 d=abs(T-TT);
   	 T=TT;
end

3)图像在最佳阈值下二值化

i1=im2bw(I,T/255); 

3.3比较DCT和二值化两种算法的压缩效果

采用GUI界面,展示DCT和二值化两种算法的压缩效果对比图,并分别计算二者的压缩比。
DCT算法的压缩比:

CR=length(enco)/length(deco);

二值化算法的压缩比:

CR1=H/image4length; 

四、结果

4.1利用DCT进行jpg压缩

为满足远程抄表系统需要,也便于与二值化结果比较,解码时结果为黑白图像即可。

利用DCT进行jpg压缩;对图像进行二值化【matlab代码】

4.2对图像进行二值化

通过图像二值化,整个彩色图像呈现出明显的黑白效果。
利用DCT进行jpg压缩;对图像进行二值化【matlab代码】

4.3比较DCT和二值化两种算法的压缩效果

比较发现DCT算法的压缩比大于二值化算法压缩比,即DCT算法的压缩程度大于二值化算法,在图片中我们也可以看出,DCT算法所得的图片比二值化算法所得的图片要模糊,结果相符。

利用DCT进行jpg压缩;对图像进行二值化【matlab代码】

上一篇:18:鸡尾酒疗法


下一篇:内存中的栈(stack)、堆(heap)和静态存储区的用法