首页 > 技术文章 > 数字图像处理及MATLAB实现实验四——图像变换

zhying99 2019-04-25 09:35 原文

1.图像的傅里叶变换一(平移性质)

 傅里叶变换的平移性质表明了函数与一个指数项相乘等于将变换后的空域中心移到新的位置,并且平移不改变频谱的幅值。

I=imread('1.bmp');
figure(1)
imshow(real(I));
I=I(:,:,3);
fftI=fft2(I);
sfftI=fftshift(fftI); %求离散傅里叶频谱
%对原始图像进行二维离散傅里叶变换,并将其坐标原点移到频谱图中央位置
RRfdp1=real(sfftI);
IIfdp1=imag(sfftI);
a=sqrt(RRfdp1.^2+IIfdp1.^2);
a=(a-min(min(a)))/(max(max(a))-min(min(a)))*225;
figure(2)
imshow(real(a));
I=imread('2.bmp');
figure(1)
imshow(real(I));
I=I(:,:,3);
fftI=fft2(I);
sfftI=fftshift(fftI); %求离散傅里叶频谱
%对原始图像进行二维离散傅里叶变换,并将其坐标原点移到频谱图中央位置
RRfdp1=real(sfftI);
IIfdp1=imag(sfftI);
a=sqrt(RRfdp1.^2+IIfdp1.^2);
a=(a-min(min(a)))/(max(max(a))-min(min(a)))*225;
figure(2)
imshow(real(a));
I=imread('3.bmp');
figure(1)
imshow(real(I));
I=I(:,:,3);
fftI=fft2(I);
sfftI=fftshift(fftI); %求离散傅里叶频谱
%对原始图像进行二维离散傅里叶变换,并将其坐标原点移到频谱图中央位置
RRfdp1=real(sfftI);
IIfdp1=imag(sfftI);
a=sqrt(RRfdp1.^2+IIfdp1.^2);
a=(a-min(min(a)))/(max(max(a))-min(min(a)))*225;
figure(2)
imshow(real(a));

 实验结果符合傅里叶变换平移性质

2.图像的傅里叶变换二(旋转性质)

%构造原始图像
I=zeros(256,256);
I(88:168,124:132)=1; %图像范围是256*256,前一值是纵向比,后一值是横向比
imshow(I)
%求原始图像的傅里叶频谱
J=fft2(I);
F=abs(J);
J1=fftshift(F);figure
imshow(J1,[5 50])
%对原始图像进行旋转
J=imrotate(I,90,'bilinear','crop');
figure
imshow(J)
%求旋转后图像的傅里叶频谱
J=fft2(I);
F=abs(J);
J2=fftshift(F);figure
imshow(J2,[5 50])

 

 

3.图像的离散余弦变换一

%对cameraman.tif文件计算二维DCT变换
RGB=imread('cameraman.tif');
figure(1)
imshow(RGB)
I=rgb2gray(RGB);
%真彩色图像转换成灰度图像
J=dct2(I);
%计算二维DCT变换
figure(2)
imshow(log(abs(J)),[])
%图像大部分能量集中在左上角处
figure(3);
J(abs(J)<10)=0;
%把变换矩阵中小于10的值置换为0,然后用idct2重构图像
K=idct2(J)/255;
imshow(K)

 

4.图像的离散余弦变换二

% I=imread('1.bmp');
% figure(1)
% imshow(real(I));
% I=I(:,:,3);
% fftI=fft2(I);
% sfftI=fftshift(fftI); %求离散傅里叶频谱
% %对原始图像进行二维离散傅里叶变换,并将其坐标原点移到频谱图中央位置
% RRfdp1=real(sfftI);
% IIfdp1=imag(sfftI);
% a=sqrt(RRfdp1.^2+IIfdp1.^2);
% a=(a-min(min(a)))/(max(max(a))-min(min(a)))*225;
% figure(2)
% imshow(real(a));
% I=imread('2.bmp');
% figure(1)
% imshow(real(I));
% I=I(:,:,3);
% fftI=fft2(I);
% sfftI=fftshift(fftI); %求离散傅里叶频谱
% %对原始图像进行二维离散傅里叶变换,并将其坐标原点移到频谱图中央位置
% RRfdp1=real(sfftI);
% IIfdp1=imag(sfftI);
% a=sqrt(RRfdp1.^2+IIfdp1.^2);
% a=(a-min(min(a)))/(max(max(a))-min(min(a)))*225;
% figure(2)
% imshow(real(a));
% I=imread('3.bmp');
% figure(1)
% imshow(real(I));
% I=I(:,:,3);
% fftI=fft2(I);
% sfftI=fftshift(fftI); %求离散傅里叶频谱
% %对原始图像进行二维离散傅里叶变换,并将其坐标原点移到频谱图中央位置
% RRfdp1=real(sfftI);
% IIfdp1=imag(sfftI);
% a=sqrt(RRfdp1.^2+IIfdp1.^2);
% a=(a-min(min(a)))/(max(max(a))-min(min(a)))*225;
% figure(2)
% imshow(real(a));

% %构造原始图像
% I=zeros(256,256);
% I(88:168,124:132)=1; %图像范围是256*256,前一值是纵向比,后一值是横向比
% imshow(I)
% %求原始图像的傅里叶频谱
% J=fft2(I);
% F=abs(J);
% J1=fftshift(F);figure
% imshow(J1,[5 50])
% %对原始图像进行旋转
% J=imrotate(I,90,'bilinear','crop');
% figure
% imshow(J)
% %求旋转后图像的傅里叶频谱
% J=fft2(I);
% F=abs(J);
% J2=fftshift(F);figure
% imshow(J2,[5 50])

% %对cameraman.tif文件计算二维DCT变换
% RGB=imread('cameraman.tif');
% figure(1)
% imshow(RGB)
% I=rgb2gray(RGB);
% %真彩色图像转换成灰度图像
% J=dct2(I);
% %计算二维DCT变换
% figure(2)
% imshow(log(abs(J)),[])
% %图像大部分能量集中在左上角处
% figure(3);
% J(abs(J)<10)=0;
% %把变换矩阵中小于10的值置换为0,然后用idct2重构图像
% K=idct2(J)/255;
% imshow(K)

RGB=imread('cameraman.tif');
I=rgb2gray(RGB);
I=im2double(I); %转换图像矩阵为双精度型
T=dctmtx(8);    %产生二维DCT变换矩阵
%矩阵T及其转置T'是DCT函数P1*X*P2的参数
B=blkproc(I,[8 8],'P1*x*P2',T,T');
maxk1=[ 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 ];  %二值掩模,用来压缩DCT系数
B2=blkproc(B,[8 8],'P1.*x',mask1); %只保留DCT变换的10个系数
I2=blkproc(B2,[8 8],'P1*x*P2',T',T);    %重构图像
figure,imshow(T);
figure,imshow(B2);
figure,imshow(I2);

RGB=imread('cameraman.tif');
I=rgb2gray(RGB);
I=im2double(I); %转换图像矩阵为双精度型
T=dctmtx(8);    %产生二维DCT变换矩阵
%矩阵T及其转置T'是DCT函数P1*X*P2的参数
B=blkproc(I,[8 8],'P1*x*P2',T,T');
maxk1=[ 1 1 1 1 0 0 0 0 
        1 1 1 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 
        0 0 0 0 0 0 0 0 ];  %二值掩模,用来压缩DCT系数
B2=blkproc(B,[8 8],'P1.*x',mask1); %只保留DCT变换的10个系数
I2=blkproc(B2,[8 8],'P1*x*P2',T',T);    %重构图像
figure,imshow(T);
figure,imshow(B2);
figure,imshow(I2);

 

5.图像的哈达玛变换

cr=0.5;
I=imread('cameraman.tif');
I=im2double(I)/255; %将读入的unit8类型的RGB图像I转换为double类型的数据
figure(1),imshow(I);%显示
                    %求图像大小
[m_I,n_I]=size(I);  %提取矩阵I的行列数,m_I为I的行数,n_I为I的列数
sizi=8;
snum=64;
%分块处理
t=hadamard(sizi) %生成8*8的哈达码矩阵
hdcoe=blkproc(I,[sizi sizi],'P1*x*P2',t,t');
                 %将图片分成8*8像素块进行哈达码变换
                 %重新排列系数
CE=im2col(hdcoe,[sizi,sizi],'distinct');
    %将矩阵hdcode分为8*8互不重叠的子矩阵,再将每个子矩阵作为CE的一列
[Y Ind]=sort(CE); %对CE进行升序排序
                  %舍去方差较小的系数,保留原系数的二分之一,即32个系数
[m,n]=size(CE);%提取矩阵CE的行列数,m为CE的行数,n为CE的列数
snum=snum-snum*cr;
for i=1:n
CE(Ind(1:snum),i)=0;
end
%重建图像
re_hdcoe=col2im(CE,[sizi,sizi],[m_I,n_I],'distinct');
                  %将矩阵的列重新组织到块中
re_I=blkproc(re_hdcoe,[sizi sizi],'P1*x*P2',t',t);
                  %进行反哈达码变换,得到压缩后的图像
re_I=double(re_I)/64; %转换为double类型的数据
figure(2);
imshow(re_I);

%计算原始图像和压缩后图像的误差
error=I.^2-re_I.^2;
MSE=sum(error(:))/prod(size(re_I));



 

推荐阅读