Re: [其他] 影像弱化的頻域問題

看板MATLAB作者 (成仔)時間8年前 (2016/12/05 11:34), 8年前編輯推噓0(001)
留言1則, 1人參與, 最新討論串2/2 (看更多)
我改了一下code 如下 用你的檔案 Hr4ogpo.png 重點應該是 1. 沒用 ifftshift -->造成fft2/ifft2轉換錯誤 2. H中有NaN數值,這個我就沒幫你算了 直接指定為1 至於fftshow子函數應該不需要吧,你程式中已經做轉換了 另外 我不知道H需不需要做fftshift @@~ 我總覺得不應該做 以上 ------------------------------------------------------------ clear clc close all image_rgb = imread('Hr4ogpo.png'); % read the image image_gray = rgb2gray(image_rgb); % transform RGB image into grayscale %imshow (image_gray); %fp = motion(image_gray); %degradation f=image_gray; imshow(f); % 轉換前 % (M,N) -- Size of the image [M,N] = size(f); [V,U] = meshgrid(1:N, 1:M); %trans the (M/2, N/2) to the origin(0,0) U = U - floor( M/2 ); V = V - floor( N/2 ); c = pi*(0.2*U+0.1*V); H = (1./c).*sin(c).*exp(-i*c); H = fftshift( H ); %這邊請你自己決定要不要這行 H(isnan(H)) = 1; % NaN數值造成轉換錯誤 F = fftshift(fft2(f)); Fp = H.*F; fp = real(ifft2(ifftshift(Fp))); fp = im2uint8( mat2gray(fp) ); figure imshow(fp); % 轉換後 ※ 引述《sherry470 (sherry)》之銘言: : 最近在學習用MATLAB處理影像 : 在做影像弱化的時候遇到一些問題想請教大家 : 我想把一個影像讀入後做FFT轉換,在頻域和degradation function相乘 : 再把相乘後的影像做反FFT轉換,得到一個比較模糊的影像 : degration function: : http://i.imgur.com/I8a2LUP.png
: 以下是我的主程式: : clear : clc : close all : image_rgb = imread('original.png'); % read the image : image_gray = rgb2gray(image_rgb); % transform RGB image into grayscale : fp = motion(image_gray); %degradation : figure,fftshow(fp, 'abs'); % show the image : title('After'); : 函數motion就是做影像處理的部分: : function fp = motion(f) : % (M,N) -- Size of the image : [M,N] = size(f); : [V,U] = meshgrid(1:N, 1:M); : %trans the (M/2, N/2) to the origin(0,0) : U = U - floor( M/2 ); : V = V - floor( N/2 ); : c = pi*(0.2*U+0.1*V); : H = (1./c).*sin(c).*exp(-1j*c); : H = fftshift( H ); : F = fftshift(fft2(f)); : Fp = H.*F; : fp = real(ifft2(Fp)); : fp = im2uint8( mat2gray(fp) ); : 函數fftshow則是參照手邊書籍中提供的方式顯示DFT轉換結果: : function fftshow(f, type) : if nargin<2, : type='log'; : end : if (type=='log') : fl = log(1+abs(f)); : fm = max(fl(:)); : imshow(im2uint8(fl/fm)) : elseif (type=='abs') : fa = abs(f); : fm = max(fa(:)); : imshow(fa/fm) : else : error('TYPE must be abs or log.'); : end; : 原圖是這樣 : http://i.imgur.com/Hr4ogpo.png
: 頻域處理相乘後的DFT是這樣 : http://i.imgur.com/ZYydO35.png
: 可是經過反FFT轉換以後變成一張全黑的圖 : 看起來像是反傅立葉轉換時出了問題 : 試了好久都沒辦法成功 : 請問是哪裡寫的怪怪的嗎QQ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.116.253.173 ※ 文章網址: https://www.ptt.cc/bbs/MATLAB/M.1480908897.A.278.html ※ 編輯: kevio (140.116.253.173), 12/05/2016 11:42:45

12/05 11:43, , 1F
c=0.001時 H=1 , 所以NaN應當指定為1
12/05 11:43, 1F
文章代碼(AID): #1OHE1X9u (MATLAB)
文章代碼(AID): #1OHE1X9u (MATLAB)