原圖:3d
(0)blog
代碼:get
I=imread('1.jpg');input
I=rgb2gray(I);it
I=im2double(I);im
F=fft2(I);數據
F=fftshift(F);top
F=abs(F);db
T=log(F+1);img
figure;
imshow(T,[]);
傅里葉變換:
(1)
分析代碼:
1. I=imread('1.jpg');
讀取圖像,很少說了
2. I=rgb2gray(I);
將圖像轉換爲灰度圖,若是沒有這一步的話,最終獲得的傅里葉變換是這個樣子的
(2)
3. I=im2double(I);
將圖像的數據格式轉換爲double型的,此時圖像的數值範圍由原來的[0,255],變成了[0,1],其實不進行轉換的話,也能夠進行傅里葉變換,只是傅里葉變換後的圖像會有所不一樣,如(3)所示,能夠跟圖(1)比較一下看看效果,有時候不一樣的人得出的傅里葉變換結果不相同,也許就是這個緣由
(3)
4. F=fft2(I);
進行傅里葉變換
5. F=fftshift(F);
對傅里葉變換後的圖像進行象限轉換,沒有這一步的話,最終輸出的結果是這樣的
(4)
6. F=abs(F);
求傅里葉變換的模,咱們都知道傅里葉變換後的結果爲複數,包含real實部和imag虛部,而abs就是求複數的模,通過這一步,F的類型由複數的double變成了實數的double,若是沒有這一步, matlab會給出提示,Warning: Displaying real part of complex input.最終輸出的結果以下。
(5)
7. T=log(F+1);
通過前幾步以後,咱們獲得了傅里葉變換的幅值,可是傅里葉變換後的數值範圍很是大,maxF = 2.04e+05,minF = 0.009,若是不進行轉換的話在圖中顯示就是圖(6)的樣子,中間有個小白點
(6)
那爲何要用log(F+1)呢。如圖7所示,對(0,1)之間的x值,通過log(X)變換後會變成負數,而log(X+1)則將全部的x值,映射成正數,數值範圍也更小一些。
(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]顯示。