不幸的是,您寻求解决的问题比您预期的要困难。 让我分四个部分进行说明。 第一部分假定您对傅立叶变换感到满意。
为什么您不能通过简单的反卷积来解决此问题。
概述如何执行图像去模糊。
通过FFT反卷积以及为什么这是个坏主意
一种执行反卷积的替代方法
但是首先,一些符号:
我用I表示图像,用K表示卷积核。 I * K是图像I与内核K的卷积。 F (I)是图像I的(n维)傅立叶变换, F (K)是卷积核K的傅立叶变换(也称为点扩展函数或PSF)。 同样, Fi是傅立叶逆变换。
为什么您不能通过简单的反卷积来解决此问题:
当你说我们能恢复模糊图像磅你是正确= I * K除以傅立叶变换K的傅立叶变换Ib的。 但是,镜头模糊不是卷积模糊操作。 这是一种改进的卷积模糊运算,其中模糊核K取决于与您拍摄的物体的距离。 因此,内核随像素变化。
您可能会认为这与图像无关,因为您已经在图像位置测量了正确的内核。 但是,情况可能并非如此,因为图像的较远部分会影响图像的较近部分。 解决此问题的一种方法是裁剪图像,以便仅可见纸。
为什么通过FFT解卷积是一个坏主意:
卷积定理指出I * K = Fi ( F (I) F (K)) 。 该定理导致一个合理的假设,即如果我们有一个图像, Ib = I * K被卷积核K模糊,那么我们可以通过计算I =( F (Ib)/ F (K))来恢复去模糊的图像。 。
在我们探讨为什么这不是一个好主意之前,我想对卷积定理的含义有一些直觉。 当我们将图像与内核卷积时,这与获取图像的频率分量并将其逐元素乘以内核的频率分量相同。
现在,让我解释一下为什么很难用FFT对图像进行卷积处理。 默认情况下,模糊会删除高频信息。 因此, K的高频必须接近零。 原因是I的高频信息在模糊时会丢失-因此, Ib的高频分量必须趋于零。 为此, K的高频分量也必须趋近于零。
由于K的高频分量几乎为零,因此我们发现,当我们对FFT解卷积时, Ib的高频分量被显着放大(因为我们几乎被零除)。 在无噪声的情况下这不是问题。
但是,在嘈杂的情况下,这是一个问题。 其原因是,按照定义,噪声就是高频信息。 因此,当我们尝试对Ib进行反卷积时,噪声几乎被无限放大。 这就是通过FFT进行反卷积不是一个好主意的原因。
此外,您需要考虑基于FFT的卷积算法如何处理边界条件。 通常,当我们对图像进行卷积时,分辨率会有所降低。 这是不必要的行为,因此我们引入了边界条件,这些条件指定了图像外部像素的像素值。 这样的边界条件的例子是
图像外部的像素与图像内部最近的像素具有相同的值
图像外部的像素具有恒定值(例如0)
该图像是周期信号的一部分,因此最上面一行上方的像素行等于最下面一行像素。
最终边界条件通常对一维信号有意义。 但是,对于图像来说,这毫无意义。 不幸的是,卷积定理规定使用周期性边界条件。
除此之外,似乎基于FFT的反演方法比迭代方法(例如,梯度下降和FISTA)对错误的内核更加敏感。
一种执行反卷积的替代方法
由于所有图像都嘈杂,因此看起来似乎已经失去了所有希望,而去卷积将增加噪点。 但是,事实并非如此,因为我们有迭代方法来执行去卷积。 首先让我向您展示最简单的迭代方法。
让|| I ||²是所有I像素的平方和。 解方程
Ib = I * K
关于I ,则相当于解决以下优化问题:
min L(I)= min || I * K-Ib ||²
关于我 。 这可以使用梯度下降来完成,因为L的梯度由
DL = Q *(I * K-Ib)
其中Q是通过转置K得到的内核(在信号处理文献中也称为匹配滤波器)。
因此,您可以获得以下将对图像进行模糊处理的迭代算法。
from scipy.ndimage import convolve
blurred_image = # Load image
kernel = # Load kernel/psf
learning_rate = # You need to find this yourself, do a logarithmic line search. Small rate will always converge, but slowly. Start with 0.4 and divide by 2 every time it fails.
maxit = 100
def loss(image):
return np.sum(convolve(image, kernel) - blurred_image)
def gradient(image):
return convolve(convolve(image, kernel) - blurred_image)
deblurred = blurred_image.copy()
for _ in range(maxit):
deblurred -= learning_rate*gradient(image)
上面的方法可能是最简单的迭代反卷积算法。 在实践中使用这些方法的方式是通过所谓的正则反卷积算法。 这些算法通过首先指定一个函数的工作,其测量噪声的图像中的量,例如TV(I)(I的总变化)。 然后在L(I)+ wTV(I)上执行优化过程。 如果您对此类算法感兴趣,建议阅读Amir Beck和Marc Teboulle撰写的FISTA论文。 这篇论文的数学运算量很大,但是您不需要了解其中的大部分内容,只需了解如何实现电视去模糊算法即可。
除了使用调节器外,我们还使用加速方法来使损失L(I)最小化。 内斯特罗夫加速梯度下降就是这样一个例子。 有关此类方法的信息,请参阅Emmanuel Candes的Brendan O'Donoghue的《自适应加速梯度方案的重新启动》。
概述如何执行图像去模糊。
裁剪图像,使一切与相机的距离相同
以与现在相同的方式查找卷积内核(首先在合成模糊图像上测试去卷积算法)
实施迭代方法来计算去甲壳素
对图像进行反卷积。