用维纳滤波复原运动模糊图像代码
时间: 2023-08-29 09:11:35 浏览: 113
运动模糊图像的维纳滤波复原研究
由于维纳滤波需要估计模糊核和噪声方差,以下代码提供了一种自适应估计方法:
```python
import cv2
import numpy as np
def wiener_filter(img, k_size=3):
# 自适应估计噪声方差和模糊核大小
k = np.ones((k_size, k_size), dtype=np.float32) / k_size ** 2
blurred = cv2.filter2D(img, -1, k)
var_n = np.mean((img - blurred) ** 2)
var_k = k_size ** 2 * var_n / np.var(k)
# 维纳滤波
psf = np.ones((k_size, k_size), dtype=np.float32) / k_size ** 2
fft_psf = np.fft.fft2(psf, img.shape[:2])
fft_img = np.fft.fft2(img)
fft_blur = np.fft.fft2(blurred)
h = np.conjugate(fft_psf) / (np.abs(fft_psf) ** 2 + var_k / var_n)
filtered = np.real(np.fft.ifft2(h * fft_blur))
return filtered.astype(np.uint8)
# 读取运动模糊图像
img = cv2.imread('motion_blur.jpg', cv2.IMREAD_GRAYSCALE)
# 维纳滤波复原
restored = wiener_filter(img)
# 显示结果
cv2.imshow('Original', img)
cv2.imshow('Restored', restored)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
在此代码中,`wiener_filter()` 函数接受一个灰度图像和一个模糊核大小参数 `k_size`,返回一个经过维纳滤波复原的图像。该函数首先使用 2D 卷积运算计算出输入图像的运动模糊版本,然后通过一个自适应估计方法估计噪声方差和模糊核大小,最后使用维纳滤波器对模糊图像进行复原。最后,使用 OpenCV 的 `imshow()` 函数显示原始图像和复原图像。
阅读全文