圖像處理做業(二)

問題 1 經過計算一維傅里葉變換實現圖像二維快速傅里葉變換

實現一個函數F=dft2D(f),其中f是一個灰度源圖像,F是其對應的二維快速傅里葉變換(FFT)圖像.具體實現要求按照課上的介紹經過兩輪一維傅里葉變換實現。也就是首先計算源圖像每一行的一維傅里葉變換,而後對於獲得的結果計算其每一列的一維傅里葉變換。編程

若是實現採用MATLAB,能夠直接調用函數fft計算一維傅里葉變換。若是採用其餘語言,請選擇並直接調用相應的一維傅里葉變換函數。數組

(1)思路

首先計算源圖像每一行的一維傅里葉變換,結果保存在矩陣temp中,而後對於獲得的結果temp計算其每一列的一維傅里葉變換,經過兩個for循環實現。bash

(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實現效果ui

 

(c)自定義dft2D函數獲得的矩陣 (d)調用matlab自帶fft2獲得的矩陣spa

圖1 問題1實現效果(續)3d

問題 2 圖像二維快速傅里葉逆變換(10分)

實現一個函數 f=idft2D(F),其中F是一個灰度圖像的傅里葉變換,f是其對應的二維快速傅里葉逆變換(IFFT)圖像,也就是灰度源圖像.具體實現要求按照課上的介紹經過相似正向變換的方式實現。code

(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.blog

(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測試效果

相關文章
相關標籤/搜索