matlab将数据压缩到指定范围,用matlab实现图像压缩 包括DCT、区域编码、门限编码、信噪比计算...

用一种变换编码的方法(如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)结果图像:

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

由于区域编码时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)结果图像

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

门限编码压缩数据时的门限模板:

a4c26d1e5885305701be709a3d33442f.png

门限编码时门限模板的选取原则为小于8*8的DCT矩阵的平均值数据就取0,根据这一原则选取的模板的压缩比为:56/64=0.875,可见压缩比较小,说明这一模板选取的不理想,应该采用冒泡法或选择法筛选出较大的数据,这样压缩比就会提高。

3)总结

通过比较这两种压缩方法,可以看出区域编码方法简单,只需设定区域,压缩比较高。但是一旦选定了某个区域就固定不变了,有时图像中的能量也会在其他区域集中较大的数值,舍掉它们会造成图像质量较大的损失。对应门限编码,其优点是有一定的自适应能力,可以得到较区域编码更好的图像质量。但是由于其超过门限值的系数的位置是随机的,因此在编码中除对系数值编码外,还要有位置码。这两种码同时传送才能在接收端正确恢复图像。所以,其压缩比有时会有所下降。综合考虑,门限编码是实际中最常用的自适应变换编码方法。

你可能感兴趣的:(matlab将数据压缩到指定范围,用matlab实现图像压缩 包括DCT、区域编码、门限编码、信噪比计算...)