Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
public:image_convolution_in_fourier_domain [2015/12/02 17:29]
fangfufu [Computing the Laplacian of an image via deconvolution]
public:image_convolution_in_fourier_domain [2018/03/31 01:38] (current)
Line 1: Line 1:
 +====== Image convolution and deconvolution in the frequency domain ======
 +Image convolution and deconvolution can be performed quickly in the frequency domain. In the frequency domain, pointwise multiplication is convolution,​ while pointwise division is deconvolution. The pseudo-code of the procedure is: 
 +  - Convert your input image into the frequency domain, via fast Fourier transform.
 +  - Pad your convolution kernel with zeros, until it reaches the same size as your input image. ​
 +  - Convert your convolution kernel into the frequency domain, via fast Fourier transform. ​
 +  - Pointwise multiply the frequency domain input image and the frequency domain convolution kernel together. ​
 +  - Convert the product from pointwise multiplication back into the spatial domain via inverse fast Fourier transform.
  
 +If you want to perform deconvolution,​ rather than perform pointwise multiplication in step 4, you do pointwise division. You have to be aware divide-by-zero problem, when you are performing deconvolution. You might want to replace all the zeros with eps(). ​
 +
 +Below are some Matlab examples. Note that Matlab takes care of the zero-padding inside the fft2() function call. 
 +
 +===== Computing the Laplacian of an image via convolution =====
 +<code matlab>
 +function [ out ] = get_laplacian( in )
 +%GET_LAPLACIAN Obtain the Laplacian of an image
 +% This is an implementation of the algorithm described in page 32-35 of 
 +% Lightness and Brightness Computation by Retinex-like Algorithms by Eran 
 +% Borenstein
 +
 +if size(in, 3) == 3
 +    for i = 1:3
 +        tmp = in(:,:,i);
 +        out(:,:,i) = get_laplacian_real(tmp);​
 +    end
 +else
 +    out = get_laplacian_real(in);​
 +end
 +
 +end
 +
 +function [ out ] = get_laplacian_real(in)
 +%% Fourier transform input image
 +a = fft2(in);
 +b = fft2(fspecial('​laplacian'​),​ size(in, 1), size(in, 2));
 +c = a.*b;
 +out = real(ifft2(c));​
 +end
 +
 +</​code>​
 +
 +===== Computing the Laplacian of an image via deconvolution =====
 +<code matlab>
 +function [ out ] = inv_laplacian(in)
 +%INV_LAPLACIAN Convert a Laplacian image back to its original
 +
 +if size(in, 3) == 3
 +    for i = 1:3
 +        tmp = in(:,:,i);
 +        out(:,:,i) = inv_laplacian_real(tmp);​
 +    end
 +else
 +    out = inv_laplacian_real(in);​
 +end
 +
 +end
 +
 +function [out] = inv_laplacian_real(in)
 +%% Fourier transform input image
 +a = fft2(in);
 +b = fft2(fspecial('​laplacian'​),​ size(in, 1), size(in, 2));
 +b(b == 0) = eps;
 +c = a./b;
 +out = real(ifft2(c));​
 +out = out + abs(min(out(:​)));​
 +end
 +
 +
 +</​code>​