⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dct.m

📁 自己写的演示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 + -