Source code for exosim.utils.convolution

import numpy as np
from scipy.interpolate import RectBivariateSpline


[docs]def fast_convolution(im, delta_im, ker, delta_ker): """fast_convolution. Convolve an image with a kernel. Image and kernel can be sampled on different grids defined. Parameters __________ im: :class:`~numpy.ndarray` the image to be convolved delta_im: float image sampling interval ker: :class:`~numpy.ndarray` the convolution kernel delta_ker: float Kernel sampling interval Returns ------- :class:`~numpy.ndarray` the image convolved with the kernel. """ # Fourier transform the kernel kerf = np.fft.rfft2(ker) ker_k = [ np.fft.fftfreq(ker.shape[0], d=delta_ker), np.fft.rfftfreq(ker.shape[1], d=delta_ker), ] ker_k[0] = np.fft.fftshift(ker_k[0]) kerf = np.fft.fftshift(kerf, axes=0) # Fourier transform the image imf = np.fft.rfft2(im) im_k = [ np.fft.fftfreq(im.shape[0], d=delta_im), np.fft.rfftfreq(im.shape[1], d=delta_im), ] im_k[0] = np.fft.fftshift(im_k[0]) imf = np.fft.fftshift(imf, axes=0) # Interpolate kernel kerf_r = RectBivariateSpline(ker_k[0], ker_k[1], kerf.real) kerf_i = RectBivariateSpline(ker_k[0], ker_k[1], kerf.imag) # Convolve imf = imf * (kerf_r(im_k[0], im_k[1]) + 1j * kerf_i(im_k[0], im_k[1])) imf = np.fft.ifftshift(imf, axes=0) return np.fft.irfft2(imf) * (delta_ker / delta_im) ** 2