# Differences

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

 public:image_convolution_in_fourier_domain [2015/12/02 17:30]fangfufu [Computing the Laplacian of an image via deconvolution] public:image_convolution_in_fourier_domain [2018/03/31 01:38] (current) Both sides previous revision Previous revision 2015/12/02 17:46 fangfufu 2015/12/02 17:30 fangfufu [Computing the Laplacian of an image via deconvolution] 2015/12/02 17:29 fangfufu [Computing the Laplacian of an image via deconvolution] 2015/12/02 17:29 fangfufu created Next revision Previous revision 2015/12/02 17:46 fangfufu 2015/12/02 17:30 fangfufu [Computing the Laplacian of an image via deconvolution] 2015/12/02 17:29 fangfufu [Computing the Laplacian of an image via deconvolution] 2015/12/02 17:29 fangfufu created 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 ===== + + 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 + + ​ + + ===== Computing the Laplacian of an image via deconvolution ===== + + 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 + + +
• public/image_convolution_in_fourier_domain.txt