图像去模糊代码 python_python

不幸的是,您寻求解决的问题比您预期的要困难。 让我分四个部分进行说明。 第一部分假定您对傅立叶变换感到满意。

为什么您不能通过简单的反卷积来解决此问题。

概述如何执行图像去模糊。

通过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的《自适应加速梯度方案的重新启动》。

概述如何执行图像去模糊。

裁剪图像,使一切与相机的距离相同

以与现在相同的方式查找卷积内核(首先在合成模糊图像上测试去卷积算法)

实施迭代方法来计算去甲壳素

对图像进行反卷积。

你可能感兴趣的:(图像去模糊代码,python)