問題 1 通過計算一維傅里葉變換實作影像二維快速傅里葉變換
實作一個函式F=dft2D(f),其中f是一個灰度源影像,F是其對應的二維快速傅里葉變換(FFT)影像.具體實作要求按照課上的介紹通過兩輪一維傅里葉變換實作,也就是首先計算源影像每一行的一維傅里葉變換,然后對于得到的結果計算其每一列的一維傅里葉變換,
如果實作采用MATLAB,可以直接呼叫函式fft計算一維傅里葉變換,如果采用其他語言,請選擇并直接呼叫相應的一維傅里葉變換函式,
(1)思路
首先計算源影像每一行的一維傅里葉變換,結果保存在矩陣temp中,然后對于得到的結果temp計算其每一列的一維傅里葉變換,通過兩個for回圈實作,
(2)代碼
function [F] = dft2D(f)
%F=fft(fft(f')')
width=size(f,1);
height=size(f,2);
for i=1:height
temp(i,1:width)=fft(f(i,1:width));
end
for i=1:width
temp(1:height,i)=fft(temp(1:height,i));
end
F=temp;
end
呼叫的主函式
(3)實作效果


(a)自定義dft2D函式實作效果 (b)呼叫matlab自帶fft2實作效果
圖1 問題1實作效果


(c)自定義dft2D函式得到的矩陣 (d)呼叫matlab自帶fft2得到的矩陣
圖1 問題1實作效果(續)
問題 2 影像二維快速傅里葉逆變換(10分)
實作一個函式 f=idft2D(F),其中F是一個灰度影像的傅里葉變換,f是其對應的二維快速傅里葉逆變換(IFFT)影像,也就是灰度源影像.具體實作要求按照課上的介紹通過類似正向變換的方式實作,
(1)思路(摘自《數字影像處理第3版 P189頁》)


(2)代碼
function [f] = idft2D(F)
%F是一個灰度影像的傅里葉變換,f是其對應的二維快速傅里葉逆變換(IFFT)影像,也就是灰度源影像
M=size(F,1);
N=size(F,2);
%取F的復共軛
F= conj(F); %呼叫matlab自帶的求復共軛函式conj
% 將F的共軛作為離散二維傅里葉正向變換的輸入,呼叫dft2D(F),再次取復共軛,并除以M*N
temp=conj(dft2D(F))/(M*N);
f=temp;
end
問題 3 測驗影像二維快速傅里葉變換與逆變換
對于給定的輸入影像 rose512.tif, 首先將其灰度范圍通過歸一化調整到[0,1]. 將此歸一化的 影像記為f.首先呼叫問題1下實作的函式dft2D計算其傅里葉變換,記為F,然后呼叫問題2下的函式idft2D計算F的傅里葉逆變換,記為g.計算并顯示誤差影像d=f-g.
(1)代碼
img=imread("rose512.tif");
imshow(img)
M=size(img,1);
N=size(img,2);
%歸一化灰度范圍
f=im2double(img)
f=f/M*N;
F=dft2D(f);
g=idft2D(F);
d=f-g
result=uint8(d)
imshow(g)
(2)效果


(a)原圖 (b)經過傅里葉變換與反變換后的影像

(c)二者做差得到的d矩陣與d取整數的result矩陣
圖2 問題3實作效果
問題 4 計算影像的中心化二維快速傅里葉變換與譜影像
我們的目標是復現下圖中的結果,首先合成矩形物體影像,建議影像尺寸為 512×512,矩形位于影像中心,建議尺寸為60像素長,10像素寬,灰度假設已歸一化設為1.對于輸入影像f計算其中心化二維傅里葉變換F,然后計算對應的譜影像S=log(1+abs(F)).顯示該譜影像,

圖 3. 矩形物體影像的傅里葉變換 (a) 源影像. (b)譜影像,注意四個角的明亮區. (c) 中心化的譜圖. (d) 對數變換后的譜圖,
(1)思路與代碼說明
首先生成一張512*512的圖片,直接把長和寬中間部分的值賦為1,再生成用于x和y方向的核,即傅里葉變換公式中的
部分,
接下來是兩個方向的回圈,生成臨時矩陣Gm和Gn,再生成傅里葉譜中心化所需要的(-1)^(x+y),對應的矩陣是C,在生成譜影像時呼叫了matlab自帶的abs函式,它可計算陣列中每個元素的幅度,
(2)代碼
問題4
% 合成一幅二值影像
img=zeros(512,512);
img(227:287,252:262)=1;
imshow(img)
img = im2double(img);
subplot(1,4,1);
imshow(img,[]);
title('原始影像')
M = size(img,1); % 長
N = size(img,2); % 寬
Gm = zeros(M)+exp(-1i*2*pi/M);
Gn = zeros(N)+exp(-1i*2*pi/N); % G是計算時要用的矩陣
%二維離散傅里葉變換所需要的Gm和Gn
for row = 0:M-1
for col = 0:M-1
Gm(row+1,col+1) = Gm(row+1,col+1)^(row * col);
end
end
% 計算Gn
for row = 0:N-1
for col = 0:N-1
Gn(row+1,col+1) = Gn(row+1,col+1)^(row * col);
end
end
% 傅里葉譜中心化
C = zeros(M,N)+(-1);%生成全為-1的矩陣
for row = 1:M
for col = 1:N
C(row,col) = C(row,col)^(row+col);%(-1)^(x+y)
end
end
% 譜影像
F = abs(Gm*img*Gn)% abs函式計算陣列中每個元素的幅度
subplot(1,4,2);
imshow(F,[]);
title('譜影像,注意四個角的明亮區');
F = real(Gm*(img.*C)*Gn); % F = Gm* f *Gn,只取實部
subplot(1,4,3);
imshow(abs(F),[]);
title('中心化的譜圖');
subplot(1,4,4);
imshow(log(abs(F) + 1),[]);
title('對數變換后的譜圖');
(3)實作效果

圖4 問題4實作效果
選做題 測驗更多影像的二維快速傅里葉變換
計算其他5幅影像的二維快速傅里葉變換:house.tif,house02.tif, lena_gray_512.tif, lunar_surface.tif, characters_test_pattern.tif,注意,有些影像的尺寸不是 2 的整數次冪,需要進行相應的像素填補處理,如果影像有多個通道可以選擇其中的一個通道進行計算,
-
思路
編程思路主要分為3部分,首先讀取影像,判斷是否有多個通道,默認取第一個,其次取影像尺寸中較長的邊,與2的整數次冪進行比較,保存在edge變數中,設定一個布爾型變數flag,用于判斷影像的尺寸是否為2的整數次冪,當為true時將進行最接近影像尺寸的2的整數次冪進行填充,最后呼叫第4題寫好的函式進行傅里葉變換(帶有中心化+對數變換),
-
代碼
主函式代碼
%問題5
img=imread("characters_test_pattern.tif");
image_size=size(img)
dimension=numel(image_size);
if dimension==3
img=img(:,:,1);% 取一個通道
end
M=size(img,1);
N=size(img,2);
subplot(2,2,1);
imshow(img,[]);
title('原圖');
%取影像尺寸中較長的邊,與2的整數次冪進行比較
if M>N
edge=M;
else
edge=N;
end
for i=4:20 %這里在將2的4次方到20次方與edge做一個比較,確定最后要填充的數
if 2^i>edge
k=i;
flag=true;
break;
end
if i==20 %回圈完了都沒找到,說明不用填充
flag=false;
end
end
if flag %當影像不是2的整數次冪時
temp=zeros(2^k,2^k);
temp(1:M,1:N)=img;
temp(M+1:2^k,N+1:2^k)=0;
subplot(2,2,2);
imshow(img,[]);
title('填充后');
imshow(temp);
img=temp;
end
temp=uint8(temp);
imshow(temp)
[img,revertclass]=tofloat(img);
[F, LogF]=dft_center(img);
subplot(2,2,3);
imshow(F,[]);
title('二維傅里葉中心化');
subplot(2,2,4);
imshow(LogF,[]);
title('對數變換后');
封裝好的dft_center函式代碼
function [outputArg1,outputArg2] = dft_center(img)
%DFT_CENTER 此處顯示有關此函式的摘要
% 此處顯示詳細說明
M = size(img,1); % 長
N = size(img,2); % 寬
Gm = zeros(M)+exp(-1i*2*pi/M);
Gn = zeros(N)+exp(-1i*2*pi/N); % G是計算時要用的矩陣
%二維離散傅里葉變換
for row = 0:M-1
for col = 0:M-1
Gm(row+1,col+1) = Gm(row+1,col+1)^(row * col);
end
end
% 計算Gn
for row = 0:N-1
for col = 0:N-1
Gn(row+1,col+1) = Gn(row+1,col+1)^(row * col);
end
end
% 傅里葉譜中心化
C = zeros(M,N)+(-1);%生成全為-1的矩陣
for row = 1:M
for col = 1:N
C(row,col) = C(row,col)^(row+col);%(-1)^(x+y)
end
end
F = real(Gm*(img.*C)*Gn); % F = Gm* f *Gn,只要實部
outputArg1 = abs(F);
outputArg2 = log(abs(F) + 1);
end
-
運行效果
(1)house.tif
測驗效果

(a)原圖(b)填充到2的整數次冪(c)二維傅里葉中心化(d)對數變換后
圖5 house.tif測驗效果
(2)house02.tif

(a)原圖(b)填充到2的整數次冪(c)二維傅里葉中心化(d)對數變換后
圖5 house02.tif測驗效果
(3)lena_gray_512.tif

(a)原圖(b)填充到2的整數次冪(c)二維傅里葉中心化(d)對數變換后
圖6 lena_gray_512.tif測驗效果
(4)lunar_surface.tif

(a)原圖(b)填充到2的整數次冪(c)二維傅里葉中心化(d)對數變換后
圖7 lunar_surface.tif測驗效果
(5)characters_test_pattern.tif

(a)原圖(b)填充到2的整數次冪(c)二維傅里葉中心化(d)對數變換后
圖8 lunar_surface.tif測驗效果
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/195251.html
標籤:其他
