Python 用于图像去模糊的维纳滤波器
我正在尝试使用维纳滤波器对模糊图像进行反褶积。我的实现是这样的Python 用于图像去模糊的维纳滤波器,python,image-processing,convolution,scikit-image,motion-blur,Python,Image Processing,Convolution,Scikit Image,Motion Blur,我正在尝试使用维纳滤波器对模糊图像进行反褶积。我的实现是这样的 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.sha
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)
此实现基于
使用的TIFF图像来自:但这里有一个PNG版本:
我有一个输入图像运动模糊的对角线核和一些高斯加性噪声被添加到它。lena图片为512x512,模糊内核为11x11 当我将维纳滤波器应用于这幅图像时,结果是这样的。 我认为这个模糊的图像质量不好。所以我想问一下我的实现是否正确 更新添加噪音的方式
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)
从scipy.signal导入高斯,卷积2D
def模糊(img,模式=框,块大小=3):
#模式='box'或'gaussian'或'motion'
虚拟=np.复制(img)
如果模式=='box':
h=np.ones((块大小,块大小))/块大小**2
elif模式==‘高斯’:
h=高斯(块大小,块大小/3)。重塑(块大小,1)
h=np.dot(h,h.transpose())
h/=np.和(h)
elif模式==“运动”:
h=np.眼(块大小)/块大小
虚拟=卷积2D(虚拟,h,模式=‘有效’)
返回np.uint8(虚拟),h
def gaussian_add(img,sigma=5):
dummy=np.copy(img).astype(float)
高斯=np.随机.正态(0,西格玛,np.形状(img))
#加性噪声
虚拟=np.圆形(高斯+虚拟)
#饱和下限
假人[np.式中(假人<0)]=0
#饱和上限
假人[np.其中(假人>255)]=255
返回np.uint8(虚拟)
对于数据比较,您可以在
如果您提供原始图像数据,我们可能会进一步提供帮助
编辑:原始链接似乎已关闭,请尝试此链接:
使用,通常用于:
>>> from skimage import color, data, restoration
>>> img = color.rgb2gray(data.astronaut())
>>> from scipy.signal import convolve2d
>>> psf = np.ones((5, 5)) / 25
>>> img = convolve2d(img, psf, 'same')
>>> img += 0.1 * img.std() * np.random.standard_normal(img.shape)
>>> deconvolved_img = restoration.wiener(img, psf, 1100)
我还将其用于:.我们也可以尝试无监督的weiner(使用Wiener-Hunt方法进行反褶积,使用随机迭代过程(Gibbs采样器)自动估计超参数,如下所述):
只是出于兴趣。。在新(模糊)图像上运行“锐化”卷积时会发生什么。修复了吗?我对图像处理还不熟悉。你这里说的锐化内核是不是类似于(以0s矩阵为中心的拉帕斯矩阵+1)?谢谢@我测试了VC.OneNevermind,它只是锐化了(有角度的)运动模糊,因此它更清晰,但看起来也“脏”。我的输入是由以下链接提供的彩色lena图像:。我正在使用PIL图像加载此图像并将其转换为RGB。我添加了一个卷积噪声和另一个标准偏差相对较小的加性高斯噪声。@tfv:您的链接断开了
deconvolved, _ = restoration.unsupervised_wiener(im, psf)