Python 卷积伪影

Python 卷积伪影,python,fft,convolution,astropy,Python,Fft,Convolution,Astropy,我使用直接卷积算法来计算此图像之间的卷积: 这个内核: 我使用中的实现来实现直接卷积 这将导致以下卷积,将所有设置(包括边界处理)保留为默认设置,即astropy.convolution.convolve(图像、内核): 这种卷积有一些令人费解的伪影。特别是,在距边缘约50像素的偏移处存在“方形”图案。在我看来,这是由于内核的范围;尽管内核的大小正式为249x249,但大多数信息显然包含在大约100像素的半径内——这意味着当内核应用于边缘时,我们可能会遇到麻烦 这就引出了我的问题: 这个假

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

这个内核:

我使用中的实现来实现直接卷积

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

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

这就引出了我的问题:

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

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

    一种解决方案是使用
    boundary='fill'
    fill\u value=(图像的平均值)
    或类似的方法。它可能不会完全移除这些工件,但应该减少它们

    对于问题的FFT卷积部分,FFT卷积也会做同样的事情。但是,边缘填充对于FFT卷积是必要的,因为否则边界将包裹。不填充(例如,
    convalve\u fft(…,boundary='wrap')
    )实际上会消除您的伪影,但它的方式可能会让您感到惊讶,因为它将平均图像右侧和左侧的像素

    astropy的
    卷积
    卷积fft
    在相同的
    边界
    条件下都会做相同的事情,但是简单的fft卷积(即
    conv=ifft(fft(im)*fft(kernel))
    相当于使用
    boundary='wrap'