当前位置:  开发笔记 > 编程语言 > 正文

卷积中的伪像

如何解决《卷积中的伪像》经验,为你挑选了1个好方法。

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

在此输入图像描述

而这个内核:

在此输入图像描述

我正在使用astropy实现直接卷积.

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

在此输入图像描述

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

这让我想到了我的问题:

    这个假设是否正确 - 它确实是一个边缘问题?

    我该如何解决这个问题?我不知道如何证明使用不同的边缘处理(零填充,插值,包装......)我确定不同的情况需要不同的解决方案,但我不知道如何决定这个...

    只是...试图理解使用直接算法和FFT卷积之间的区别.如果内核和图像大小相同,FT卷积不需要零填充,则不会出现边缘效应.对于直接方法,您将无意中进行一些边缘处理......那么结果是否相等?因为原则上他们的表现应该不同,对吗?

keflavich.. 10

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

一种解决方案是使用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'.



1> keflavich..:

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

一种解决方案是使用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'.

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有