图像去模糊算法 循序渐进 附完整代码
时间: 2023-11-10 12:27:06 浏览: 65
基于维纳滤波的图像去运动模糊算法附matlab代码.zip
好的,我可以为您提供图像去模糊算法的代码。以下是一个基于逆滤波的算法,逐步优化去模糊效果的完整代码:
```python
import cv2
import numpy as np
# 读取图片
img = cv2.imread('blurry_image.jpg')
# 创建一个高斯核
kernel_size = 5
kernel = cv2.getGaussianKernel(kernel_size, 0)
# 通过高斯卷积进行模糊处理
blurred = cv2.filter2D(img, -1, kernel)
# 显示原图和模糊图
cv2.imshow('Original Image', img)
cv2.imshow('Blurred Image', blurred)
# 逆滤波算法
# 1. 恢复图像的傅里叶变换
dft = cv2.dft(np.float32(blurred), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
# 2. 恢复模糊核的傅里叶变换
kernel_dft = cv2.dft(np.float32(kernel), flags=cv2.DFT_COMPLEX_OUTPUT)
kernel_dft_shift = np.fft.fftshift(kernel_dft)
# 3. 估计噪声功率
magnitude_kernel = cv2.magnitude(kernel_dft_shift[:, :, 0], kernel_dft_shift[:, :, 1])
magnitude_blurred = cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1])
signal_noise_ratio = 0.1 # 信噪比
power_noise = (magnitude_blurred ** 2) / (signal_noise_ratio * magnitude_kernel ** 2)
# 4. 逆滤波
inverse_filter = np.conj(kernel_dft_shift) / (np.abs(kernel_dft_shift) ** 2 + power_noise)
# 5. 恢复图像
filtered_dft_shift = dft_shift * inverse_filter
filtered_dft = np.fft.ifftshift(filtered_dft_shift)
restored = cv2.idft(filtered_dft)
restored = cv2.magnitude(restored[:, :, 0], restored[:, :, 1])
# 显示去模糊后的图像
cv2.imshow('Restored Image', restored.astype(np.uint8))
cv2.waitKey(0)
cv2.destroyAllWindows()
```
该算法的思路是先将原始图像进行高斯模糊处理,然后通过逆滤波算法进行去模糊操作。逆滤波算法的具体步骤包括:估计噪声功率、求傅里叶变换、求傅里叶变换逆滤波,最后恢复图像。在代码中,我们可以通过调节`signal_noise_ratio`参数来控制算法的去模糊效果。
阅读全文