初探FFT在數字圖像處理中的應用
一般FFT在通信等領域都做的一維變換就能夠了。可是在圖像處理方面,須要做二維變換,這個時候就須要用到FFT2.
在利用Octave(或者matlab)里面的fft2()函數的時候,觀察頻率領域的圖像還是要點額外的技巧的.以下的圖像是我們想要的,也是我們人類才干夠理解的(圖片的中心表示低頻區域,越是遠離中心。頻率越高,這里以下圖片中,中心區域非常亮,value非常高,中心周圍越來越暗,表示低頻信號強,高頻信號慢慢減弱)
>> result = fft2(dark_channel);
>> imshow(uint8(real(result)));
直接輸出fft2的結果例如以下(正常人應該看不出什么吧~)
怎么得到之前我們給出的結果呢?
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % code writer : EOF % code date : 2014.09.27 % code file : fft2_demo.m % e-mail : jasonleaster@gmail.com % % If there is something wrong with my code, please % touch me by e-mail. Thank you :) % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clear all clc Original_img = imread('/home/jasonleaster/Picture/hand.png'); float_Orignal_img = double(Original_img); F64_WHITE = 255.0; F64_BLACK = 0.000; Original_img_row = size(Original_img,1); Original_img_col = size(Original_img,2); Original_img_channel = size(Original_img,3); for row = 1:Original_img_row for col = 1:Original_img_col min_piexl = F64_WHITE; for channel = 1: Original_img_channel if(min_piexl > Original_img(row,col,channel)) min_piexl = Original_img(row,col,channel); end end dark_channel(row,col) = min_piexl; end end result = fft2(dark_channel); %spectrum = fftshift(abs(result)); spectrum = result; figure(1); spectrum = spectrum*255/max(spectrum(:)); imshow(spectrum);
這里一定記得fftshift,不然會出現以下的結果,低頻結果分散在四個角落
正確結果例如以下