【问题标题】:Artifacts in convolution卷积中的伪影
【发布时间】:2015-12-17 10:21:37
【问题描述】:

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

还有这个内核:

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

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

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

这让我想到了我的问题:

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

【问题讨论】:

    标签: python fft convolution astropy


    【解决方案1】:

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

    一种解决方案是使用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)))等效于使用boundary='wrap'

    【讨论】:

      猜你喜欢
      • 2014-04-26
      • 2018-06-20
      • 2010-10-08
      • 1970-01-01
      • 2018-02-17
      • 1970-01-01
      • 2017-11-25
      • 2018-11-11
      • 2021-11-09
      相关资源
      最近更新 更多