源码链接: https://blog.csdn.net/qq_44394952/article/details/122588241.
在远程抄表系统中,需要将采集的图像远距离传输以供抄表人观看,由于距离远和控制成本的问题,不能采用较高速度的波特率进行传输,需要将采集到的图像进行压缩后传输,给出合理的解决方案。
1.1学习DCT及jpg压缩原理,通过matlab仿真,利用DCT进行jpg压缩;
1.2通过matlab仿真,对图像进行二值化,利用二值图像压缩方法进行数据压缩,然后进行解压缩,看通过肉眼能否看清汽车牌照;
1.3比较DCT和二值化两种算法的压缩效果;
在读取图片时采用RGB三基色信号,然后转换为YUV彩色模型的图像便于后续压缩、增强、恢复,此时如果只有Y信号分量而没有U、V分量,则为黑白灰度图。最后还原成RGB三基色信号。转换公式如下所示:
RGB转换为YUV:
YUV转换为RGB:
后续的DCT变换是基于8×8大小的像素块,因此一个数字图像在DCT之前需要进行分块。但是一个图像的分辨率中长宽不一定都是8的倍数,此时需要对之边缘补成8的倍数然后进行分块。由于图像的YUV三个分量是交替出现的,首先需要将YUV三个分量分开存入3张表中;然后依次从左到右,从上到下,读取8×8的子块,存放到64长度的表中。
DCT是先将原M×N的图像进行分块,然后在逐一的进行DCT。DCT变换是在最小均方误差准则下得出的次最佳正交变换,
量化就是用像素值÷量化表对应值(量化步长)所得的结果。由于量化表左上角的值较小,右上角的值较大,这样就起到了保持低频分量,抑制高频分量的目的。对Y采用细量化,对UV采用粗量化。
编码前先进行Z字形扫描排序,把二维变换的变换系数矩阵转换为一维序列,保证数列里的相邻点在图片上也是相邻的。
JPEG的基本系统的熵编码采纳了平均压缩比最高的编码哈夫曼编码,其理论依据是变字长编码理论。在变字长编码中,编码器的编码输出码字是长度不等的码字,按照编码输入信息符号出现的统计概率,给输出码字分配不同的字长,出现概率极高的分配较短的码字,反之出现概率较低的则分配较长的码字,从而得到较好的压缩效果。
图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。
对图像进行二值化的难点在于二值化阈值的确定,若是直接通过graythresh()确定阈值,但是常常会出现较大偏差,因此选用迭代阈值最佳算法求最佳阈值。
压缩比=压缩前的所占字节数/压缩后的所占字节数
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'); %把向量重新转换成图像块;
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);
采用GUI界面,展示DCT和二值化两种算法的压缩效果对比图,并分别计算二者的压缩比。
DCT算法的压缩比:
CR=length(enco)/length(deco);
二值化算法的压缩比:
CR1=H/image4length;
为满足远程抄表系统需要,也便于与二值化结果比较,解码时结果为黑白图像即可。
比较发现DCT算法的压缩比大于二值化算法压缩比,即DCT算法的压缩程度大于二值化算法,在图片中我们也可以看出,DCT算法所得的图片比二值化算法所得的图片要模糊,结果相符。
源码链接: https://blog.csdn.net/qq_44394952/article/details/122588241.