数字图像处理

数字图像处理

对于运动引起的图像模糊,最简单的方法是直接做逆滤波,即在已知退化函数的时候使用逆变换得到原图像。但是逆滤波对加性噪声特别敏感,使得恢复的图像几乎不可用。下面一些方法可以解决这个问题,但这些都是基于在已知或者通过一些方法估计得到退化函数的基础之上进行的。

维纳滤波

最小均方差(维纳)滤波用来去除含有噪声的模糊图像,其目标是找到一个均方差最小的估计,可以去除噪声,同时清晰化模糊图像。

均方差的定义如下:

$f$ 是原图像,$\hat{f}$ 是对原图像的估计,让他们方差的期望最小。

原生的维纳滤波函数比较复杂,但在处理白噪声的时候,可以进行简化,也就是现在常用的滤波函数:

其中 $H(u,v)$ 代表退化函数(傅里叶变换后),$|H(u,v)^2|=H(u,v)H^*(u,v)$ 即和共轭复数相乘。 $K$ 是常数,一般可以通过交互式选择。

1
2
3
4
5
6
7
def wiener(inp, PSF, K=0.01):
input_fft = np.fft.fft2(inp)
PSF_fft = np.fft.fft2(PSF) + 1e-3
PSF_fft_1 = np.conj(PSF_fft) / (np.abs(PSF_fft) ** 2 + K)
result = np.fft.ifft2(input_fft * PSF_fft_1)
result = np.abs(np.fft.fftshift(result))
return result

约束最小二乘方滤波

尽管已经简化,维纳滤波的 $K$ 仍需要调整,有些时候他并不总是一个合适的解。

约束最小二乘方滤波(Constrained Least Squares Filtering)对于每张图片都会产生最优的结果。

约束最小二乘方法的算法核心是 $H$ 对噪声的敏感性问题。减少噪声敏感的一种方法是以平滑度量的最佳复原为基础的,如一幅图像的二阶导数,要使复原有意义,就必须使用问题的参数来约束复原。建立下列准则函数 $C$ 和约束条件:

其中 $\hat{f}$ 是退化函数,$\eta$ 是加性噪声,拉普拉斯算子在这里可以表示平滑程度,$||a||^2=a^Ta$。

将上式表示成矩阵的形式,同时将约束项转换为拉格朗日子乘项:

其中 $\lambda$ 是拉格朗日乘子。原问题转为最小化上式,对 $\hat{f}$ 求导,令其等于零,有

拉格朗日乘子法简单的来说就是把约束条件添加到求极值的式子中。原因在于当在约束下取极值时,约束曲线一定和原函数的极小值曲线相切,即在切点处两函数梯度成正比。

解得

式中$\lambda$ 必须调整到满足约束条件,而 $p(u,v)$ 是如下函数的傅里叶变换

至此我们可以写出 PLSF

1
2
3
4
5
6
7
8
9
10
11
12
def constrained_least_sq(inp, PSF, gamma=0.05):
kernel = np.array([[0, -1, 0],
[-1, 4, -1],
[0, -1, 0]])
PSF_kernel = np.fft.fft2(kernel)
inp_fft = np.fft.fft2(inp)
PF = np.fft.fft2(PSF)
numerator = np.conj(PF)
denominator = PF ** 2 + gamma * (PSF_kernel ** 2)
result = np.fft.ifft2(numerator * inp_fft / denominator)
result = np.abs(np.fft.fftshift(result))
return result

当然,如果更加精确的调整参数 gamma,既可以选择交互式的方法,根据课本中的公式,也有一种自动的调整方法。

已知这是一个单调递增的函数,我们要做的是调整 gamma 使得 $||r||^2 = ||\eta||^2 \pm \alpha$,其中 $\alpha$ 是一个精确度因子,可以用牛顿法,折半法等寻找最小的值。

  • 对于 $||r||^2$ 的计算,注意到 $R(u,v) = G(u,v)-H(u,v)F(u,v)$,这样我们可以给出
  • 对于 $||\eta||^2$,我们考虑整张图上的噪声方差,采用取样平均法来估计(当然也可以人为规定)
  • 上面计算的前提是假设噪声和灰度值是不相关的,我们使用一些可以假定的估计的噪声如椒盐噪声,加性噪声等来估计未知量 $\eta$
1
# 待补充

参考

Author

Ctwo

Posted on

2021-08-15

Updated on

2021-08-22

Licensed under

Comments