數字圖像處理及MATLAB實現實驗四——圖像變換


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));



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM