一. 离散余弦变换
归一化的二维傅里叶变换如下:
从傅里叶变换到离散余弦变换,需要一些数学理论的支持。在给定区间内满足狄利赫里条件的连续实对称函数,可以展开成仅含有余弦项的傅里叶级数。
以一个二维离散函数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('用离散余弦变换压缩过的图像')