2014-11-04 130 views
2

我正试图在彩色图像上应用FFT。我提取了三个分量:红色,绿色和蓝色,然后我分别应用fft2,然后我在每个平面上应用高斯滤波器。现在我试图在模糊后显示红色,绿色和蓝色的组件。之后,我申请ifft2以获得结果。使用FFT和IFFT对彩色图像进行低通滤波

我的问题是我看到每个组件中的灰色图像。我试图只显示颜色平面,但我的代码不起作用。另外,我想将这三个组件结合在一起以返回到全彩色图像。我在下面写了下面的代码。谁能告诉我我做错了什么?

% Calculate FFT for R , G , B images 

I = imread ('lena.jpg'); 

% Extract three images 
Red = I (: , : , 1); 
Green = I (: , : , 2); 
Blue = I(: , : , 3); 

f_r = fftshift (Red); 
F_r = fft2 (f_r); 

f_g = fftshift (Green); 
F_g = fft2 (f_g); 

f_b = fftshift (Blue); 
F_b = fft2 (f_b); 

% Calculate the gaussian filter then find its FFT 
h = fspecial('gaussian', [512 512] , 3.0); 
h = fftshift (h); 
H = fft2(h); % Fourier Transform of 2D Gaussian 

FF_R = H .* F_r ; 

FF_G = H .* F_g; 

FF_B = H .* F_b; 

% This is to get red, green and blue images 
b = zeros(512, 512); 

% Inverse IFFT _RED 
Ir = ifftshift(FF_R); 
Irr= ifft2 (Ir); 
I_R = fftshift (Irr); 
IFF_R = 1 + log (abs(I_R)); 
figure , imshow (IFF_R , [ ]); 

Con1 = im2uint8(IFF_R); 
just_red_2 = cat(3, Con1, b, b); 
figure, imshow (just_red_2); 


% Inverse IFFT _Green 
Ig = ifftshift(FF_G); 
Igg= ifft2 (Ig); 
I_G = fftshift (Igg); 
figure , imshow (1+ log(abs(I_G)), [ ]); 
just_green_2 = cat(3, b, I_G, b); 
%figure, imshow (1 + log(abs(just_green_2))); 

% Inverse IFFT Blue 
Ib = ifftshift(FF_B); 
Ibb= ifft2 (Ib); 
I_B = fftshift (Ibb); 
figure , imshow (1+ log(abs(I_B)), [ ]); 
just_blue_2 = cat(3, b,b, I_B); 
%figure, imshow (1 + log(abs(just_blue_2))); 


%Combine the three component togather 
%full_image2 = cat (3, FF_R , FF_G , FF_B); 
full_image2 = cat (3, just_red_2 (:,:,1) , just_green_2(:,:,2) , just_blue_2(:, :, 3)); 
%full_image2 (: , : , 1) = FF_R (: , : , 1); 
%full_image2 (: , : , 2) = FF_G (: , : , 2); 
%full_image2 (: , : , 3) = FF_B (: , : , 3); 
Full = ifft2 (ifftshift(full_image2)); 
figure, imshow (Full , [ ]) 

Final = fftshift(Full); 
figure , imshow (full_image2) 

回答

3

你正在做很多不必要的计算。一旦你分开过滤飞机,你可以立即将它们组合起来。此外,您的红色组件正在执行log转换,而其他颜色通道没有执行此操作。另外,一旦转换图像,您实际上需要执行fftshift,以便您可以对光谱进行居中。你先做了fftshift,这是不正确的。同样的事情需要应用到你的过滤器定义。一旦你过滤图像,你必须仔细扭转你的操作。正向转换包括做fft2,然后是fftshift。反向操作要求您输入ifftshift,然后ifft2之后。你走向与你的行动相反的方向。

我需要强调的一件事是,你需要铸造你的图像飞机加倍,以保持计算的精确性完好无损。你不这样做,所以所有的计算都在uint8中完成。

在执行ifft2之后可能会有一些残留虚数值,因此最好使用real消除虚部。根据您的评论,我制作了一个图形,显示红色,绿色和蓝色组件的色调完整,以及2 x 2窗格中的最终模糊图像。

有了这个,这里是你的代码修改,以适应我的意见。您还没有包括你的形象与您的文章,但我用维基百科上一个版本莉娜:

现在,请记住,我删除了很多你的代码来实现你的目标:

% Calculate FFT for R , G , B images 

I = imread ('https://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png'); 

I = double(I); %// Change - cast to double 

% Extract three images 
Red = I (: , : , 1); 
Green = I (: , : , 2); 
Blue = I(: , : , 3); 

% // Change - Transform, then shift 
f_r = fft2(Red); 
F_r = fftshift(f_r); 

f_g = fft2(Green); 
F_g = fftshift(f_g); 

f_b = fft2(Blue); 
F_b = fftshift(f_b); 

% Calculate the gaussian filter then find its FFT 
h = fspecial('gaussian', [512 512] , 3.0); 

%// Change - Filter, then FFT shift 
H = fft2(h); % Fourier Transform of 2D Gaussian 
H = fftshift(H); 

% // Now filter 
FF_R = H .* F_r ; 
FF_G = H .* F_g; 
FF_B = H .* F_b; 

%// Change - perform ifftshift, then ifft2, then cast to real 
% Inverse IFFT _RED 
Ir = ifftshift(FF_R); 
Irr = fftshift(real(ifft2(Ir))); 

% Inverse IFFT _Green 
Ig = ifftshift(FF_G); 
Igg = fftshift(real(ifft2(Ig))); 

% Inverse IFFT _Blue 
Ib = ifftshift(FF_B); 
Ibb = fftshift(real(ifft2(Ib))); 

%// Visualize the red, green and blue components 
b = zeros(512, 512, 'uint8'); 
image_red = cat(3,Irr, b, b); 
image_green = cat(3, b, Igg, b); 
image_blue = cat(3, b, b, Ibb); 

%Combine the three component together 
%// Change - Removed fluff 
b = uint8(cat(3, Irr, Igg, Ibb)); 

%// NEW - Display each component as well as the final image in a new figure 
figure; 
subplot(2,2,1); 
imshow(image_red); 
subplot(2,2,2); 
imshow(image_green); 
subplot(2,2,3); 
imshow(image_blue); 
subplot(2,2,4); 
imshow(b); 

这是数字我得到:

enter image description here

+0

感谢您的重播....其实这是要求申请FFT分别对高斯和3个图像进行乘法运算然后返回到颜色! ...如果我切换步骤,是否有任何问题? – Seereen2004 2014-11-04 22:05:13

+0

@ Seereen2004 - 那么,您可以先对图像执行一次“ifftshift”,然后在此之后应用“fft”将光谱带到左上角。我不明白“切换步骤”的含义。 – rayryeng 2014-11-04 22:06:21

+0

当我尝试你的代码我没有得到正确的图像! ......它需要再次移动......而我看到绿色是最多的! – Seereen2004 2014-11-04 22:14:26