Yes, this is an edge effect problem that arises from the fact that you have negative values in your kernel. As soon as the core partially leaves the edge, the average value of the core begins to change.
One solution would be to use boundary='fill' and fill_value=(mean of your image) or something similar to these lines. This may not completely remove these artifacts, but this should reduce them.
For the FFT convolution part of your question, the FFT convolution will do the same. However, edge striping is required for FFT convolution, because otherwise the boundary will be completed. Not padding (e.g. convolve_fft(..., boundary='wrap') ) will actually save you from your artifacts, but it will do it in a way that may surprise you, since it will average the pixels on the right side of the image on the left side .
astropy convolve and convolve_fft will both do the same under the same boundary conditions, but a naive fft convolution (i.e. conv = ifft(fft(im) * fft(kernel)) ) is equivalent to using boundary='wrap' .
source share