使用matlab對圖像進行傅里葉變換


原圖:

0

(0)

代碼:

I=imread('1.jpg');

I=rgb2gray(I);

I=im2double(I);

F=fft2(I);

F=fftshift(F);

F=abs(F);

T=log(F+1);

figure;

imshow(T,[]);

傅里葉變換:

1

(1)

分析代碼:

1. I=imread('1.jpg');

讀取圖像,不多說了

2. I=rgb2gray(I);

將圖像轉換為灰度圖,如果沒有這一步的話,最終得到的傅里葉變換是這個樣子的

2

(2)

3. I=im2double(I);

將圖像的數據格式轉換為double型的,此時圖像的數值范圍由原來的[0,255],變成了[0,1],其實不進行轉換的話,也可以進行傅里葉變換,只是傅里葉變換后的圖像會有所不同,如(3)所示,可以跟圖(1)比較一下看看效果,有時候不同的人得出的傅里葉變換結果不相同,也許就是這個原因

3

(3)

4. F=fft2(I);

進行傅里葉變換

5. F=fftshift(F);

對傅里葉變換后的圖像進行象限轉換,沒有這一步的話,最終輸出的結果是這樣的

4

(4)

6. F=abs(F);

求傅里葉變換的模,我們都知道傅里葉變換后的結果為復數,包含real實部和imag虛部,而abs就是求復數的模,經過這一步,F的類型由復數的double變成了實數的double,如果沒有這一步, matlab會給出提示,Warning: Displaying real part of complex input.最終輸出的結果如下。

5

(5)

7. T=log(F+1);

經過前幾步之后,我們得到了傅里葉變換的幅值,但是傅里葉變換后的數值范圍非常大,maxF = 2.04e+05,minF = 0.009,如果不進行轉換的話在圖中顯示就是圖(6)的樣子,中間有個小白點

6

(6)

那為什么要用log(F+1)呢。如圖7所示,對(0,1)之間的x值,經過log(X)變換后會變成負數,而log(X+1)則將所有的x值,映射成正數,數值范圍也更小一些。

7

(7)

8. figure;imshow(T,[]);

顯示圖像,之所以用imshow(T,[]);而不是imshow(T)。是因為即使經過對數變換后T的取值范圍仍然大於[0,1],maxT=12.23,minT=0.009。imshow(T)只會顯示[0,1]的值,而imshow(T,[]) 會根據灰度圖的數值范圍來顯示圖像,相當於將[0.09,12.23]映射到[0,1]顯示。


免責聲明!

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



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