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

源码链接: https://blog.csdn.net/qq_44394952/article/details/122588241.

一、任务及目标

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

二、原理及设计方案

2.1利用DCT进行jpg压缩

在这里插入图片描述

2.1.1颜色空间转换

在读取图片时采用RGB三基色信号,然后转换为YUV彩色模型的图像便于后续压缩、增强、恢复,此时如果只有Y信号分量而没有U、V分量,则为黑白灰度图。最后还原成RGB三基色信号。转换公式如下所示:
RGB转换为YUV:
在这里插入图片描述

YUV转换为RGB:

在这里插入图片描述

2.1.2分块

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

2.1.3离散余弦变换DCT

DCT是先将原M×N的图像进行分块,然后在逐一的进行DCT。DCT变换是在最小均方误差准则下得出的次最佳正交变换,
在这里插入图片描述

2.1.4量化

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

2.1.5编码

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

2.2对图像进行二值化

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

在这里插入图片描述

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压缩

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

在这里插入图片描述

4.2对图像进行二值化

通过图像二值化,整个彩色图像呈现出明显的黑白效果。
在这里插入图片描述

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

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

在这里插入图片描述
源码链接: https://blog.csdn.net/qq_44394952/article/details/122588241.

  • 5
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值