用一种变换编码的方法(如DCT变换)对图像进行压缩和解压缩,分别采用区域编码法和门限编码法处理变换系数(也可用熵编码方法);简述原理,打印出原始图像和解压后图像,计算信噪比,估算出压缩比。
本文采用的是DCT变换
1)区域编码
(1)程序运行平台:matlab
(2)流程:读入图像--->进行8*8分离块操作 对源图像进行DCT变换--->数据压缩(丢弃区域外即右下角的高频数据)--->进行反DCT变换--->计算信噪比--->显示压缩前和压缩后的图像
(3)程序代码:
clear
I = imread('me1.bmp');
I=im2double(rgb2gray(I));
T=dctmtx(8);
B=blkproc(I,[8 8],'P1*x*P2',T,T');%进行8*8分离块操作
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('压缩后的图像')
snr=SNR(I,I2);
fprintf('区域编码的信噪比%d\n',snr);
其中计算信噪比的函数SNR(I,In)代码如下:
function snr=SNR(I,In)
% snr=10*log10(sigma2(I2)/sigma2(I2-I1))
[row,col,nchannel]=size(I);
snr=0;
if nchannel==1%gray image
Ps=sum(sum((I-mean(mean(I))).^2));%signal power
Pn=sum(sum((I-In).^2));%noise power
snr=abs(10*log10(Ps/Pn));
elseif nchannel==3%color image
for i=1:3
Ps=sum(sum((I(:,:,i)-mean(mean(I(:,:,i)))).^2));%signal power
Pn=sum(sum((I(:,:,i)-In(:,:,i)).^2));%noise power
snr=snr+abs(10*log10(Ps/Pn));
end
snr=snr/3;
end
(4)结果图像:
由于区域编码时8*8的掩膜中保留了左上角10个数据,所以压缩比为10/64=0.15625
2)门限编码
(1)程序运行平台:matlab
(2)流程:读入图像--->进行8*8分离块操作 对源图像进行DCT变换--->数据压缩(计算DCT8*8变换矩阵的平均值,舍掉小于平均值的数据,以此为数据压缩的模板)--->进行反DCT变换--->计算信噪比--->显示压缩前和压缩后的图像
(3)实现代码
clear
I = imread('me1.bmp');
I=im2double(rgb2gray(I));
T=dctmtx(8);%离散余弦变换矩阵
B=blkproc(I,[8 8],'P1*x*P2',T,T');%进行8*8分离块操作 对源图像做DCT变换
b=reshape(T,1,64);
midvalue=median(b);
a=ones(8,8);
for i=1:8
for j=1:8
if(abs(T(i,j))
a(i,j)=0;
end;
end;
end;
B2=blkproc(B,[8 8],'P1.*x',a);%数据压缩,丢弃右下角高频数据
I2=blkproc(B2,[8 8],'P1*x*P2',T',T);%进行反DCT变换
imshow(I)
title('原始图像')
figure;
imshow(I2)
title('压缩后的图像')
snr=SNR(I,I2);
fprintf('门限编码后图像的信噪比%d\n',snr);
(4)结果图像
门限编码压缩数据时的门限模板:
门限编码时门限模板的选取原则为小于8*8的DCT矩阵的平均值数据就取0,根据这一原则选取的模板的压缩比为:56/64=0.875,可见压缩比较小,说明这一模板选取的不理想,应该采用冒泡法或选择法筛选出较大的数据,这样压缩比就会提高。
3)总结
通过比较这两种压缩方法,可以看出区域编码方法简单,只需设定区域,压缩比较高。但是一旦选定了某个区域就固定不变了,有时图像中的能量也会在其他区域集中较大的数值,舍掉它们会造成图像质量较大的损失。对应门限编码,其优点是有一定的自适应能力,可以得到较区域编码更好的图像质量。但是由于其超过门限值的系数的位置是随机的,因此在编码中除对系数值编码外,还要有位置码。这两种码同时传送才能在接收端正确恢复图像。所以,其压缩比有时会有所下降。综合考虑,门限编码是实际中最常用的自适应变换编码方法。