天天看点

Matlab图像压缩一.作业内容三.运行结果

一.作业内容

读取一幅灰度或者彩色图像,实现下列算法: 

首先将图像分成许多8X8的子图像,对每个子图像进行DCT,对每个子图像的64个系数,按照每个系数的大小来排序后, 舍去小的变换系数,只保留16个系数,实现图像4:1的压缩。

二.作业分析

cr = 0.25;
i = imread('lena.jpg');
i = rgb2gray(i);
i1 = im2double(i);
%i1 = i/255;
subplot(121);
imshow(i);
title('原图像');
%对图像进行哈达玛变换
t = dctmtx(8);%生成一个8*8 DCT变换矩阵
dctcoe = blkproc(i1,[8 8],'P1*x*P2',t,t');%将图像分割为8*8的子图像进行FFT
%x就是每一个分成的8*8大小的块,P1*x*P2相当于像素块的处理函数,p1 = T p2 = T’,
%也就是fun = p1*x*p2' = T*x*T'的功能是进行离散余弦变换
coevar = im2col(dctcoe,[8 8],'distinct');%降变换系数矩阵重新排列
coe = coevar;
[y,ind] = sort(coevar);
[m,n] = size(coevar);%根据压缩比确定要变0的系数个数
%舍去不重要的系数
snum = 64 - 64 * cr;
for i = 1:n
    coe(ind(1:snum),i) = 0;%将最小的snum个变换系数清0
end
b2 = col2im(coe,[8 8],[512 512],'distinct');%重新排列系数矩阵
%对截取后的变换系数进行哈达玛逆变换
i2 = blkproc(b2,[8 8],'P1*x*P2',t',t);%对截取后的变换系数进行哈达玛逆变换
subplot(122);
imshow(i2);
title('DCT变换图像');
           

三.运行结果

Matlab图像压缩一.作业内容三.运行结果