8

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

在此处输入图像描述

这个内核:

在此处输入图像描述

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

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

在此处输入图像描述

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

这让我想到了我的问题:

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

1 回答 1

10

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

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

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

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

于 2015-12-17T15:41:49.653 回答