编写Python代码,给图像添加方向为60度的平面匀速运动模糊以及高斯噪声,并用有约束最小二乘法对图像进行复原。(结果需显示:原图、污染图、复原图)
时间: 2024-10-23 08:15:30 浏览: 32
在Python中,我们可以使用`numpy`库进行数值计算,`PIL`库处理图像,以及`scipy.optimize`库来进行有约束最小二乘法的优化。这里是一个基本步骤的例子:
```python
import numpy as np
from PIL import Image, ImageFilter
import scipy.optimize
# 加载原图
img = Image.open('original_image.jpg')
original = np.array(img)
# 添加60度平面均匀运动模糊
angle = 60
motion_blur = img.filter(ImageFilter.Kernel(size=9, kernel=[np.cos(angle*np.pi/180), -np.sin(angle*np.pi/180), np.sin(angle*np.pi/180), np.cos(angle*np.pi/180)]))
# 添加高斯噪声
sigma = 5
noisy_img = motion_blur + sigma * np.random.randn(*motion_blur.size).astype(np.float32)
noisy = noisy_img.astype(np.uint8)
# 显示污染图
display(noisy_img)
# 有约束最小二乘法复原
def cost_function(x, data, model):
return np.sum((data - model)**2) + lambda_val * np.linalg.norm(x)
# 使用高斯核作为模型
kernel_size = (5, 5)
lambda_val = 0.1 # 正则化强度
model = scipy.ndimage.gaussian_filter(original, sigma=(kernel_size[0]/2, kernel_size[1]/2))
x0 = original.flatten() # 初始估计
# 优化求解
result = scipy.optimize.minimize(cost_function, x0, args=(noisy, model), method='TNC', options={'disp': True})
# 将复原后的像素值转换回图像
recovered = result.x.reshape(original.shape)
# 显示复原图
display(recovered)
# 显示图片需要导入对应的显示模块,如matplotlib.pyplot或showit等
# display函数示例(仅作展示,实际项目需引入相应库)
# plt.imshow(recovered, cmap='gray')
# plt.show()
#
阅读全文