I was writing this Jupyter Notebook. Then, I unexpectedly faced two visually similar output, but their numerical results were very different.

This is the code I used for convolution in the time domain:

filtered_k1 = sp.signal.convolve2d(img, k1, mode='same')
filtered_k2 = sp.signal.convolve2d(img, k2, mode='same')

def FT(x):
    return np.fft.fft2(x)

def iFT(x):
    return np.fft.ifft2(x)

def pad_kernel(k, x):
    x_h, x_w = x.shape
    k_h, k_w = k.shape
    padding = [[0, x_h - k_h], [0, x_w - k_w]]
    return np.pad(k, padding, mode='constant', constant_values=0)

k1_big = pad_kernel(k1, img)
k2_big = pad_kernel(k2, img)

K1_BIG = FT(k1_big)
K2_BIG = FT(k2_big)

filtered_K1 = np.real(iFT(IMG * K1_BIG))
filtered_K2 = np.real(iFT(IMG * K2_BIG))

diff1 = filtered_K1 - filtered_k1
diff2 = filtered_K2 - filtered_k2

The RSS on diff1 and diff2 was not residual numerical error, as I expected.

  • 1
    $\begingroup$ The convolution using the fft results in a circular convolution; is that what is causing your difference in the results? $\endgroup$ – Dan Boschen Jan 4 at 14:14
  • $\begingroup$ I am not sure. If this is the case, I would like to know how to set up sp.signal.convolve2d to yield the same output $\endgroup$ – Eduardo Reis Jan 4 at 18:13

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Browse other questions tagged or ask your own question.