卷积中的伪影

Artifacts in convolution

我正在使用直接卷积算法计算此图像之间的卷积:

和这个内核:

我正在使用 astropy 中的实现进行直接卷积。

这导致以下卷积,将所有设置(包括边界处理)保留为默认值,即 astropy.convolution.convolve(image,kernel):

这个卷积有一些令人费解的伪影。特别是,在距边缘约 50 像素的偏移处有一个 'square' 图案。在我看来,这是由于内核的范围造成的;尽管内核的大小正式为 249x249,但大部分信息显然都包含在大约 100 像素的半径内——这意味着当内核应用于边缘时,我们可能 运行 会遇到麻烦。

这让我想到了我的问题:

  1. 这个假设是否正确 - 它确实是一个边缘问题?
  2. 我将如何解决这个问题?我不知道如何证明使用不同的边缘处理(零填充、插值、环绕……)我确信不同的情况需要不同的解决方案,但我不确定如何决定这个……
  3. 只是...试图了解使用直接算法和 FFT 卷积之间的区别。如果内核和图像同样大,则 FT 卷积不需要补零,也不会出现边缘效应。对于直接方法,您会不经意地进行一些边缘处理……那么结果是否相同?因为原则上只有它们的性能应该不同,对吗?

是的,这是一个边缘效应问题,因为您的内核中有负值。一旦内核部分偏离边缘,内核的平均值就会开始变化。

一个解决方案是使用 boundary='fill'fill_value=(mean of your image) 或类似的东西。它可能不会完全消除这些伪影,但应该会减少它们。

对于您问题的 FFT 卷积部分 - FFT 卷积会做同样的事情。但是,边缘填充 是 FFT 卷积所必需的 ,否则边界会环绕。 Not 填充(例如,convolve_fft(..., boundary='wrap'))实际上会消除你的伪像,但它会以一种可能会让你感到惊讶的方式做到这一点,因为它将平均像素图像的右侧与左侧。

astropy 的 convolveconvolve_fft 都会在相同的 boundary 条件下做同样的事情,但是朴素的 fft 卷积(即 conv = ifft(fft(im) * fft(kernel)))相当于使用 boundary='wrap'.