离散余弦变换在图像压缩中的应用

一.   离散余弦变换

归一化的二维傅里叶变换如下:

从傅里叶变换到离散余弦变换,需要一些数学理论的支持。在给定区间内满足狄利赫里条件的连续实对称函数,可以展开成仅含有余弦项的傅里叶级数。

以一个二维离散函数f(x,y)(x,y=0,1,…N-1)为例,对其进行偶延拓。

假如序列中不包含零点,自然按照以下方式延拓:f(1,0)=f(-1,0),f(0,1)=f(0,-1),对称中心为 (0,0)

由于序列中包括零点,考虑零点后的延拓方式:f(0,0)=f(-1,0),f(0,0)=f(0,-1) ,对称中心为 (-1/2,-1/2)

因此,按照上述方法延拓后,归一化的二维离散余弦变换可以写成如下形式:


其中,

                                          

                      


    ~矩阵形式的二维离散余弦变换

语法

B=dct2(A)

B=dct2(A,m,n)

B=dct2(A,[m,n])

 

描述

B=dct2(A)返回A的二维离散余弦变换。矩阵B和A的大小一样,并包含离散余弦变换系数

B=dct2(A,m,n)是在变换以前用0对矩阵A进行填充,填充到m*n的大小。如果m或者n比A相应的小,dct2会将A缩短。

B=dct2(A,[m,n])同上面一样。

程序:

clear all;close all;clc
f=imread('F:\matlab\MATLAB上机操作\图形\13100210.jpg');
f=rgb2gray(f);
f=im2double(f);
F1=dct2(f);
subplot(211),imshow(f,[])
title('原图')
subplot(223),imshow(log(1+abs(F1)),[]),
title('用dct2得到的离散余弦变换')
[M,N]=size(f);
[x,u]=meshgrid(0:M-1,0:M-1);
G1=sqrt(2/M)*cos((2*x+1).*u*pi/(2*M));
G1(1,:)=G1(1,:)/sqrt(2);
[v,y]=meshgrid(0:N-1,0:N-1);
G2=sqrt(2/N)*cos((2*y+1).*v*pi/(2*N));
G2(:,1)=G2(:,1)/sqrt(2);
F2=G1*f*G2;
subplot(224),imshow(log(1+abs(F2)),[]),
title('用矩阵法得到的离散余弦变换')
colormap(winter)

 

反变换程序:

clear all;close all;clc

f=imread('F:\matlab\MATLAB上机操作\图形\13100210.jpg');

f=rgb2gray(f);

f=im2double(f);

F1=dct2(f);

figure

subplot(211),imshow(f,[])

title('原图')

f1=idct2(F1);

subplot(223),imshow(log(1+abs(F1)),[]),title('离散变换后的图像')

subplot(224),imshow(f1,[]),title('反变换后的图像')

blkproc功能:对图像进行分块处理

功能:对图像进行分块处理

函数调用形式:

B = blkproc(A,[m n],fun,parameter1, parameter2, ...)

B = blkproc(A,[m n],[mbordernborder],fun,...)

B = blkproc(A,'indexed',...)

参数解释:

    [m n] : 图像以m*n为分块单位,对图像进行处理(如8像素*8像素)

         Fun:   应用此函数对分别对每个m*n分块的像素进行处理

         parameter1,parameter2: 要传给fun函数的参数

         mbordernborder:对每个m*n块上下进行mborder个单位的扩充,左右进行nborder个单位的扩充,扩充的像素值为0,fun函数对整个扩充后的分块进行处理。

基于DCT的解压缩方法:

(1).对每8x8或16x16块进行二维DCT反变换

(2).将反变换后的矩阵的块合成一个单一的矩阵

例如将13100210.jpg划范围8x8的图像块,计算他们的DCT系数,并且只保留64个DCT系数中的10个DCT系数进行逆DCT变换来重构图像

可以看到,虽然我们舍弃了大多数的DCT系数,减少了存储量,但重构后的图像依然清晰


程序:

clear all;close all;clc
f=imread('F:\matlab\MATLAB上机操作\图形\13100210.jpg');
f=rgb2gray(f);
f=im2double(f);
T=dctmtx(8);                     %产生8*8离散余弦变换矩阵
subplot(121),imshow(f,[])
title('原图')
B=blkproc(f,[8,8],'P1*x*P2',T,T');  %T和T'是DCT函数P1*x*P2的参数
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);
f1=blkproc(B2,[8 8],'P1*x*P2',T',T);
subplot(122)
imshow(f1,[])
title('用离散余弦变换压缩过的图像')

猜你喜欢

转载自blog.csdn.net/revitalise/article/details/80594753