📄 dct.m
字号:
%功能: 使用DCT变换对图像实现压缩
%作者: 陈伊力
%序号: 7号
clear all;
clc;
lena_org = imread('lena256.bmp');
figure(1),imshow(lena_org);title('原图像');
[m,n] = size(lena_org);
lena_double = double(lena_org);
%------------------------------------------------------------
%生成DCT变换矩阵G
%------------------------------------------------------------
N = 8;
G = zeros(N,N);
G(1,:)=1/sqrt(N);
p = 1:N-1;
q = 0:N-1;
G(p+1,q+1)=sqrt(2/N)*cos(p'*(2*q+1)*pi/(2*N));
%-------------------------------------------------------------
%区域编码压缩
%-------------------------------------------------------------
%生成一个保留50%左上角系数的模板矩阵
Mask1 = zeros(N,N);
for i = 1:N
for k = 1:N
if((N-i)>=k)
Mask1(i,k) = 1;
end
if((N-i)==k-1) %为了精确保留50%,对角线上也是保留一半系数
if(mod(i,2)==1)
Mask1(i,k) = 1;
end
end
end
end
%对图像实现DCT变换并应用区域编码
lena_dct1 = blkproc(lena_double,[N N],'P1*x*P2.*P3',G,G',Mask1);
%复原图像
lena_decomp1 = uint8(blkproc(lena_dct1,[N N],'P1*x*P2',G',G));
figure(2),imshow(lena_decomp1);title('区域编码压缩图像');
%---------------------------------------------------------------
%阈值编码压缩
%---------------------------------------------------------------
Mask2 = zeros(m,n);
%对图像作DCT变换并应用阈值编码
lena_dct2 = blkproc(lena_double,[N N],'P1*x*P2',G,G');
Mid = median(median(abs(lena_dct2)));
Mask2 = (abs(lena_dct2) > Mid); %采用全局中值
lena_dct2_masked = blkproc(lena_dct2,[m n],'x.*P1',Mask2);
%恢复图像
lena_decomp2 = uint8(blkproc(lena_dct2_masked,[N N],'P1*x*P2',G',G));
figure(3),imshow(lena_decomp2);title('阈值编码压缩图像');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -