import numpy as np import cv2 def motion_blur(image, degree=7, angle=45): image = np.array(image) # 这里生成任意角度的运动模糊kernel的矩阵, degree越大,模糊程度越高 M = cv2.getRotationMatrix2D((degree / 2, degree / 2), angle, 1) motion_blur_kernel = np.diag(np.ones(degree)) motion_blur_kernel = cv2.warpAffine(motion_blur_kernel, M, (degree, degree)) motion_blur_kernel = motion_blur_kernel / degree blurred = cv2.filter2D(image, -1, motion_blur_kernel) # convert to uint8 cv2.normalize(blurred, blurred, 0, 255, cv2.NORM_MINMAX) blurred = np.array(blurred, dtype=np.uint8) return blurred def add_gaussian_noise(image, mean=0, std=10): noise = np.random.normal(mean, std, image.shape).astype(np.uint8) noisy_image = cv2.add(image, noise) return noisy_image img = cv2.imread('lena_gray.tif') # 修改运动模糊函数的调用参数 img_ = motion_blur(img, degree=7, angle=-45) noisy_img = add_gaussian_noise(img_) cv2.imshow('Original image', img) cv2.imshow('blur image', img_) cv2.imshow('blur and noisy image', noisy_img) cv2.waitKey() 使用直接逆滤波方法复原blur and noisy image,写出修改后的代码
时间: 2025-06-26 07:01:24 浏览: 12
为了使用直接逆滤波方法对 `blur and noisy image` 进行复原,需要基于傅里叶变换原理完成去卷积操作。以下是完整代码及解释:
```python
import numpy as np
import cv2
def motion_blur(image, degree=7, angle=45):
"""添加运动模糊"""
image = np.array(image)
M = cv2.getRotationMatrix2D((degree / 2, degree / 2), angle, 1)
motion_blur_kernel = np.diag(np.ones(degree))
motion_blur_kernel = cv2.warpAffine(motion_blur_kernel, M, (degree, degree))
motion_blur_kernel = motion_blur_kernel / degree
blurred = cv2.filter2D(image, -1, motion_blur_kernel)
cv2.normalize(blurred, blurred, 0, 255, cv2.NORM_MINMAX)
blurred = np.array(blurred, dtype=np.uint8)
return blurred, motion_blur_kernel
def add_gaussian_noise(image, mean=0, std=10):
"""添加高斯噪声"""
noise = np.random.normal(mean, std, image.shape).astype(np.int32) # 使用int32避免溢出
noisy_image = image + noise
noisy_image[noisy_image > 255] = 255
noisy_image[noisy_image < 0] = 0
return np.array(noisy_image, dtype=np.uint8)
def inverse_filter(image, kernel):
"""直接逆滤波恢复图像"""
image_fft = np.fft.fft2(image.astype(float)) # 对含噪模糊图做FFT
kernel_padded = np.zeros_like(image).astype(float)
kh, kw = kernel.shape
kernel_padded[:kh, :kw] = kernel # 将核填充到与图像相同的大小
kernel_fft = np.fft.fft2(kernel_padded) # 对模糊核做FFT
restored_fft = image_fft / kernel_fft # 直接逆滤波
restored = np.abs(np.fft.ifft2(restored_fft)) # IFFT并取绝对值
restored = np.clip(restored, 0, 255).astype(np.uint8) # 转换为uint8范围
return restored
if __name__ == "__main__":
img = cv2.imread('lena_gray.tif', cv2.IMREAD_GRAYSCALE)
# 添加运动模糊和高斯噪声
img_, kernel = motion_blur(img, degree=7, angle=-45)
noisy_img = add_gaussian_noise(img_)
# 图像复原
restored_img = inverse_filter(noisy_img, kernel)
# 显示结果
cv2.imshow("Original Image", img)
cv2.imshow("Blurred and Noisy Image", noisy_img)
cv2.imshow("Restored Image by Inverse Filter", restored_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
### 关键点说明:
1. **运动模糊**:通过指定角度和长度生成了运动模糊核,并将其作用于原始图像。
2. **高斯噪声**:模拟现实场景,在图像上叠加随机的高斯分布噪声。
3. **直接逆滤波**:利用 FFT 把空间域上的除法转换成频域中的乘法运算。注意这里假设我们已知精确的模糊核。
---
#### §相关问题§:
1. 如果模糊核未知如何处理?
2. 高斯白噪声是否会对逆滤波效果造成严重影响?
3. 是否有其他改进版的滤波算法可以替代直接逆滤波?
阅读全文