我想实现维纳滤波器对模糊图像执行去卷积。我的实现是这样的维纳滤波器的图像去模糊
import numpy as np
from numpy.fft import fft2, ifft2
def wiener_filter(img, kernel, K = 10):
dummy = np.copy(img)
kernel = np.pad(kernel, [(0, dummy.shape[0] - kernel.shape[0]), (0, dummy.shape[1] - kernel.shape[1])], 'constant')
# Fourier Transform
dummy = fft2(dummy)
kernel = fft2(kernel)
kernel = np.conj(kernel)/(np.abs(kernel) ** 2 + K)
dummy = dummy * kernel
dummy = np.abs(ifft2(dummy))
return np.uint8(dummy)
此实现基于Wiki Page。
使用的TIFF图像是:http://www.ece.rice.edu/~wakin/images/lena512color.tiff
但这里是低于PNG版本:
我有一个对角线内核和一些高斯加性噪声迷离输入图像的运动加入到它。 lena图片是512x512,模糊内核是11x11。
当我将wiener_filter应用于此图像时,结果如下所示。 。
我觉得这个deblurred图像质量不好。所以我想问一下我的实施是否正确。
非常感谢!
更新我添加噪音的方式。
from scipy.signal import gaussian, convolve2d
def blur(img, mode = 'box', block_size = 3):
# mode = 'box' or 'gaussian' or 'motion'
dummy = np.copy(img)
if mode == 'box':
h = np.ones((block_size, block_size))/block_size ** 2
elif mode == 'gaussian':
h = gaussian(block_size, block_size/3).reshape(block_size, 1)
h = np.dot(h, h.transpose())
h /= np.sum(h)
elif mode == 'motion':
h = np.eye(block_size)/block_size
dummy = convolve2d(dummy, h, mode = 'valid')
return np.uint8(dummy), h
def gaussian_add(img, sigma = 5):
dummy = np.copy(img).astype(float)
gauss = np.random.normal(0, sigma, np.shape(img))
# Additive Noise
dummy = np.round(gauss + dummy)
# Saturate lower bound
dummy[np.where(dummy < 0)] = 0
# Saturate upper bound
dummy[np.where(dummy > 255)] = 255
return np.uint8(dummy)
只是出于兴趣..当你对新(模糊)图像运行“锐化”卷积时会发生什么。它修复了吗? –
我是图像处理新手。这里的锐化内核是什么意思?(lapacian矩阵+ 1以0s矩阵为中心)?谢谢。 @ VC.One – yc2986
没关系,我测试过,它只是削尖(有角度)的运动模糊,所以它更清脆,但看起来“脏”。 –