卷积中的伪像

时间:2015-12-17 10:21:38

标签: python fft convolution astropy

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

enter image description here

和这个内核:

enter image description here

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

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

enter image description here

这个卷积有一些令人费解的文物。特别是,有一个方形'偏离边缘约50个像素的图案。在我看来,这是由于内核的程度;即使内核大小正式为249x249,大多数信息显然都包含在大约100个像素的半径内 - 这意味着当内核应用于边缘时,我们可能会遇到麻烦。

这让我想到了我的问题:

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

1 个答案:

答案 0 :(得分:9)

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

一种解决方案是使用boundary='fill'fill_value=(mean of your image)或类似的东西。它可能无法完全删除这些工件,但它应该减少它们。

对于你问题的FFT卷积部分 - FFT卷积将做同样的事情。但是,FFT卷积需要边缘填充 ,否则边界将会换行。 填充(例如,convolve_fft(..., boundary='wrap'))实际上将摆脱你的工件,但它会以一种可能让你感到惊讶的方式做到这一点,因为它将平均来自右侧的像素左侧的图像。

astropy的convolveconvolve_fft在相同的boundary条件下都会做同样的事情,但天真的fft卷积(即conv = ifft(fft(im) * fft(kernel)))等同于使用{ {1}}。