正交变换是信号处理的一种有效工具。图像信号不仅可以在空间域表示,也可以在频域表示,后者将有利于许多问题的分析及讨论。对图像进行正交变换,在图像增强、图像复原、图像特征提取、图像编码等处理中都经常采用。常用的正交变换有多种,主要有离散傅里叶变换、离散余弦变换、K-L变换,Radon变换和离散小波变换等。
离散傅里叶变换(Discrete Fourier Transform,DFT)是直接处理离散时间信号的傅里叶变换,在数字信号处理中应用广泛。
FFT(快速傅里叶变换):直接对序列进行DFT,运算量大,很难实时地处理问题。因此,根据DFT的奇、偶、虚、实等特性,对DFT算法进行改进而获得FFT算法。
例:基于MATLAB编写程序,实现打开图像﹐对其进行DFT变换并显示频谱图
Image=imread('desert.jpg');%读取图像
grayI=rgb2gray(Image);%将彩色图像灰度化
DFTI1=fft2(grayI); % 计算离散傅里叶变换
ADFTI1=abs(DFTI1); % 计算傅里叶谱
top=max(ADFTI1(:)); % 取最大值
bottom=min(ADFTI1(:)); % 取最小值
ADFTI1=(ADFTI1-bottom)/(top-bottom)*100;
ADFTI2=fftshift(ADFTI1);%计算傅里叶变换并移位
subplot(131),imshow(Image),title('原图');%显示原图像
subplot(132),imshow(ADFTI1),title('原频谱图');%显示傅里叶变换频谱图
subplot(133),imshow(ADFTI2),title('移位频谱图');%显示傅里叶变换频谱图
% imwrite(ADFTI1,'dftpinpu2_1.jpg');
% imwrite(ADFTI2,'dftpinpu2_2.jpg');
运行结果:原频谱图中四角部分对应低频成分,中央部分对应高频成分;移位频谱图将频谱图进行移位,频谱图中间部分为低频部分,越靠外边频率越高。图像中的能量主要集中在低频区,高频能量很少或为零。
离散余弦变换在图像处理中主要用于对图像(包括静止图像和运动图像)进行有损数据压缩。如静止图像编码标准JPEG、运动图像编码标准MPEG中都使用了离散余弦变换。这是由于离散余弦变换具有很强的“能量集中”特性—大多数的能量都集中在离散余弦变换后的低频部分,压缩编码效果较好。
具体的做法一般是先把图像分成8×8的块,对每一个方块进行二维DCT变换,变换后的能量主要集中在低频区。对 DCT系数进行量化,对高频系数大间隔量化,对低频部分小间隔量化,舍弃绝大部分取值很小或为О的高频数据,降低数据量﹐同时保证重构图像不会发生显著失真。
例:编写程序,实现打开图像,对其进行DCT变换并显示频谱图。
Image=imread('cameraman.jpg');%读取图像
imshow(Image);%显示原图像
grayI=rgb2gray(Image);%将彩色图像灰度化
figure,imshow(grayI);
DCTI=dct2(grayI);%计算余弦变换并移位
ADCTI=abs(DCTI);
top=max(ADCTI(:));
bottom=min(ADCTI(:));
ADCTI=(ADCTI-bottom)/(top-bottom)*100;
figure,imshow(ADCTI);%显示余弦变换频谱图
imwrite(ADCTI,'cameramandct.jpg');
运行结果:
例:基于MATLAB编程,打开一幅图像,对其进行DCT变换﹔将高频置为0,并讲行反变换
Image=imread('desert.jpg');%读取图像
grayIn=rgb2gray(Image);%将彩色图像灰度化
[h,w]=size(grayIn);
DCTI=dct2(grayIn);%计算dct变换 离散余弦变换
cf=60;
FDCTI=zeros(h,w); % w x h的空矩阵
FDCTI(1:cf,1:cf)=DCTI(1:cf,1:cf);% 给矩阵赋值
grayOut=uint8(abs(idct2(FDCTI)));% 余弦变换后求傅里叶谱
subplot(121),imshow(Image),title('原图');%显示原图像
subplot(122),imshow(grayOut),title('压缩重建');
% imwrite(grayOut,'peppersidct.jpg');
运行结果:
K-L变换(Karhunen-Loeve Transform)是建立在统计特性基础上的一种变换,又称为霍特林(Hotelling)变换或主成分分析。K-L变换的突出优点是相关性好,是均方误差(Mean Square Error,MSE)意义下的最佳变换,它在数据压缩技术中占有重要地位。
图像K-L变换:将二维图像采用行堆叠或列堆叠的方法转换为一维处理。
例:基于MATLAB编写程序,打开人脸图像,对其进行K-L变换,并显示变换结果。
clear,clc,close all;
fmt={'*.jpg','JPEG image(*.jpg)';'*.*','All Files(*.*)'};
[FileName,FilePath]=uigetfile(fmt,'导入数据','face*.jpg','MultiSelect','on'); % 从文件系统中读取图像
if ~isequal([FileName,FilePath],[0,0])
FileFullName=strcat(FilePath,FileName);% 将图像存入到结构体中
else
return;
end
N=length(FileFullName);
for k=1:N
Image=im2double(rgb2gray(imread(FileFullName{k})));
X(:,k) = Image(:); % 列堆叠,把图像放在矩阵x的第k列
end
[h,w,c]=size(Image);
% %----------- 计算每幅训练图像的与平均脸的差值 -------%
averagex = mean(X')'; %计算图像的平均向量u
X=X-averagex; % 求中心化图像向量 B = f - u
%-----奇异值分解方法计算协方差矩阵的特征值和特征向量----%
R = X'*X; %协方差矩阵为x*x’,这里用奇异值分解
[Q,D] = eig(R); %V为以特征向量为列的矩阵,D为特征值组成的对角阵
[D_sort,index] = sort(diag(D),'descend');
D=D(index,index);
Q = Q(:,index); % 按从大到小顺序重排特征值矩阵D和特征向量矩阵Q
P = X*Q*(abs(D))^-0.5; % 求左奇异矩阵P
total = 0.0;
count = sum(D_sort);
for r =1:N
total = total + D_sort(r);
if total/count > 0.95 %当差异信息比例达到95%时退出循环;取占全部奇异值之和95%的前r个奇异值
break;
end
end
%-------------测试样本在新空间上投影后的坐标-----------%
KLCoefR = P'*X;
figure; plot(KLCoefR(1,:),KLCoefR(2,:),'ko'),title('K-L变换行压缩');
xlabel('第一主成分得分');ylabel('第二主成分得分');
Y= P(:,1:2)*KLCoefR(1:2,:)+averagex; %重建 基于前两个奇异值重建人脸
for j=1:N
outImage=reshape(Y(:,j),h,w);
% top=max(outImage(:));
% bottom=min(outImage(:));
% outImage=(outImage-bottom)/(top-bottom);
% str=strcat('feaface12_',num2str(j),'.jpg');
% imwrite(outImage,str);
figure,imshow(outImage,[]);
end
Z= P(:,1:r)*KLCoefR(1:r,:)+averagex; % 基于前r个奇异值重建人脸图像
for j=1:N
outImage=reshape(Z(:,j),h,w);
% top=max(outImage(:));
% bottom=min(outImage(:));
% outImage=(outImage-bottom)/(top-bottom);
% str=strcat('feaface1r_',num2str(j),'.jpg');
% imwrite(outImage,str);
figure,imshow(outImage,[]);
end
KLCoefC = X*Q; % 使用右奇异矩阵进行K-L变换
for j =1:N
outImage=reshape(KLCoefC(:,j),h,w);
% top=max(outImage(:));
% bottom=min(outImage(:));
% outImage=(outImage-bottom)/(top-bottom);
% str=strcat('feaface',num2str(j),'.jpg');
% imwrite(outImage,str);
figure,imshow(outImage,[]);
end
%
%
运行结果:
作为重要的数学工具,小波变换被应用到数字图像处理的多个方面,如图像平滑﹑边缘检测、图像分割及压缩编码等。
例:利用MATLAB提供的二维离散小波函数实现对cameraman图像的一级、二级分解及重构。
close all,clear,clc;
Image=imread('cameraman.jpg');
subplot(1,3,1),imshow(Image);
grayI=rgb2gray(Image);
[ca1,ch1,cv1,cd1]=dwt2(grayI,'db4'); % 用db4小波对图像进行一级小波分解
DWTI2=[wcodemat(ca1,256),wcodemat(ch1,256);wcodemat(cv1,256),wcodemat(cd1,256)];% 组成小波系数显示矩阵
subplot(1,3,2),imshow(DWTI2/256); % 显示一级分解后的近似和细节图象
imwrite(DWTI2/256,'dwt1.jpg');
result=idwt2(ca1,ch1,cv1,cd1,'db4');% 一级重构
subplot(1,3,3),imshow(result,[]); % 重构图像显示
% 二级分解
Image=imread('cameraman.jpg');
grayI=rgb2gray(Image);
[c,s]=wavedec2(grayI,2,'db4'); % 用db4小波对图像进行二级小波分解
ca2=appcoef2(c,s,'db4',2); % 提取二级小波分解低频变换系数
[ch2,cv2,cd2] = detcoef2('all',c,s,2);% 提取二级小波分解高频变换系数
[ch1,cv1,cd1] = detcoef2('all',c,s,1);% 提取一级小波分解高频变换系数
ca1=[wcodemat(ca2,256),wcodemat(ch2,256);wcodemat(cv2,256),wcodemat(cd2,256)];
k=s(2,1)*2-s(3,1); % 两级高频系数长度差
ch1=padarray(ch1,[k k],1,'pre');
cv1=padarray(cv1,[k k],1,'pre');
cd1=padarray(cd1,[k k],1,'pre'); % 填充一级小波高频系数数组,使两级系数维数一致
DWTI2=[ca1,wcodemat(ch1,256);wcodemat(cv1,256),wcodemat(cd1,256)];
subplot(1,2,1),imshow(DWTI2/256),title('二级分解'); % 显示二级分解后的近似和细节图像
% imwrite(DWTI2/256,'dwt2.jpg');
result= waverec2(c,s,'db4'); % 二级重构
subplot(1,2,2),imshow(result,[]),title('二级重构'); % 重构图像显示
% imwrite(result/256,'redwt2.jpg');
运行结果: