用于图像去模糊的维纳滤波器

2023-11-27

我正在尝试实现维纳滤波器来对模糊图像执行反卷积。我的实现是这样的

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)

该实现基于维基页面.

The TIFF image used is from : http://www.ece.rice.edu/~wakin/images/lena512color.tiff
But here is a PNG version:

我有一个由对角核模糊的输入图像运动,并向其中添加了一些高斯加性噪声。 lena图片为512x512,模糊内核为11x11。

When I apply my wiener_filter to this image the result is like this. enter image description here.

我认为这个模糊的图像质量不好。所以我想问一下我的实现是否正确。

Update我添加噪音的方式。

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)

Use skimage.restoration.wiener,通常使用如下:

>>> 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)

我也用过它:使用 scikit-image 去模糊图像.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于图像去模糊的维纳滤波器 的相关文章

随机推荐

  • 如何在 MATLAB 中创建分段内联函数?

    我在 MATLAB 中有一个函数 它接受另一个函数作为参数 我想以某种方式定义一个可以传入的分段内联函数 这在 MATLAB 中是否可行 编辑 我想代表的功能是 f x 1 0 0 0 lt x lt 0 5 1 0 0 5 lt x lt
  • 从 JavaScript 读取 web.config

    有什么方法可以使用 javascript 读取 web config 中的配置值吗 我为什么要这么做 我的网站中有一个计时器 如果用户 20 分钟不活动 它会弹出一个带有倒计时器的模式对话框 倒计时 2 分钟 如果用户没有响应 系统会将其注
  • 如果数组中的所有对象都有属性值,则返回 true

    我有一个对象数组 如下所示 scope objectArray Title object1 Description lorem Value 57 Title object2 Description ipsum Value 32 Title
  • 在 sqlalchemy 中使用计算列更新表

    我正在使用 SQLalchemy 在旧版 MSSQL 数据库中工作 我有一个声明性映射 该数据库有几个表 其中包含计算列 我可以很好地阅读它们 但是 当然 写入计算列不起作用 但是 当我创建并尝试保存 ORM 对象时 SQLAlchemy
  • 活动的 AlertDialog 样式按钮

    我有一个活动 底部有一个 保存 和 取消 按钮 在 AlertDialog 中 按钮显示在某种样式化的容器视图内 我怎样才能让我的活动中的按钮具有相同的外观 具体来说 我如何应用 AlertDialog 中按钮容器视图的样式来表示我的 Ac
  • 在 JavaScript 中将字符串转换为变量名

    我一直在寻找解决方案 但找不到任何有效的解决方案 我有一个变量叫做onlyVideo onlyVideo 字符串被传递到函数中 我想设置变量onlyVideo在函数内部作为某种东西 我怎样才能做到这一点 有很多变量可以被调用到函数中 所以我
  • Android 输入文本对话框

    当用户单击Button在我的应用程序中 打印在SurfaceView 我想要一条短信Dialog出现 我想将结果存储在String 我想要文字Dialog覆盖当前屏幕 我怎样才能做到这一点 听起来是一个使用的好机会警报对话框 尽管看起来很简
  • OpenCV 2.2 Windows XP MinGW 构建在namedWindow、imshow 上崩溃

    我下载了适用于 Windows 的最新 OpenCV 2 2 源代码 并在 CMake 2 8 的帮助下使用 MinGW 4 4 1 在 Windows XP 上进行编译 一切都很顺利 编译 mingw32 make 和安装 mingw32
  • 调试:为多列创建多个滞后的函数 (dplyr)

    我想创建多个变量的多个滞后 所以我认为编写一个函数会很有帮助 我的代码抛出警告 将向量截断为长度 1 和错误结果 library dplyr time lt c 2000 2009 2000 2009 x lt c 1 10 10 19 i
  • 将 HTML 转换为 XML

    我有数百个 HTML 文件需要转换为 XML 我们使用这些 HTML 为应用程序提供内容 但现在我们必须以 XML 形式提供这些内容 HTML 文件包含 表格 div 图像 p b 或强标记等 我用谷歌搜索并找到了一些应用程序 但我还无法实
  • 是否有比使用 C++ 的 FindFirstFile/FindNextFile 更快的枚举文件夹替代方法?

    我需要获取文件夹内子文件夹的所有路径 使用 WinAPI 和 C 到目前为止 我发现的唯一解决方案是递归调用查找第一个文件 查找下一个文件但在层次结构较深的文件夹上执行此操作需要花费大量时间 所以我想知道 只是为了获取文件夹名称 是否有更快
  • 有没有比忙等待更智能的方法来检查 System.Net.WebClient.DownloadFileAsync() 的下载完成情况?

    我正在使用 System Net WebClient DownloadFileAsync 下载文件 使用异步版本的唯一原因是显示下载进度 在达到 100 之前 我的代码执行可能不会继续 目前我正在使用忙等待 参见代码 但我想知道是否有更聪明
  • fgetpos() 行为取决于换行符

    考虑这两个文件 file1 txt Windows 换行符 abc r n def r n file2 txt Unix 换行符 abc n def n 我注意到对于 file2 txt 通过以下方式获得的位置fgetpos没有正确增加 我
  • 可移动/可拖动

    这是我更新和修改的脚本 它完全可以工作 除了我想通用它 观察 我怎样才能做到这一点 这样我就不必这样做function e BOX Draggable elemen e target e srcElement elementDraggabl
  • Jenkins:在 MultiJob 中共享变量

    我使用 Jenkins 进行测试 构建 因此我使用以下配置创建了一个 MultiJob 项目 Test Job 建立工作 安装工作 MultiJob 从 Master Jenkins 启动 但其他作业从其他 Node 启动 构建作业执行创建
  • DVCLAL 的所有可能值的列表是什么?

    当我遇到这个函数时 我正在阅读 SysUtils function ALR Pointer var LibModule PLibModule begin if MainInstance lt gt 0 then Result Pointer
  • sql触发器打印消息

    我是在数据库中使用触发器的新手 我创建了一些对我来说非常有效的触发器 除了当我尝试创建一个在删除行后显示一条消息的触发器时 我尝试使用这段代码 ALTER TRIGGER mycustomerTrigger AFTER delete ON
  • 如何在 git 中查看传入的提交? [复制]

    这个问题在这里已经有答案了 可能的重复 使用 Git 如何在本地和远程之间查找修改过的文件 如何在 git 中查看传入的提交 或者甚至更好 看看我刚刚说的git fetch git pulled Edit 为了澄清这个问题 有人告诉我 为了
  • 为什么 JVM 不缓存 JIT 编译的代码?

    Sun 的规范 JVM 实现对字节码应用了一些相当复杂的优化 以便在代码运行几次后获得接近本机的执行速度 问题是 为什么不将此编译后的代码缓存到磁盘以供后续使用同一函数 类时使用 按照目前的情况 每次执行程序时 JIT 编译器都会重新启动
  • 用于图像去模糊的维纳滤波器

    我正在尝试实现维纳滤波器来对模糊图像执行反卷积 我的实现是这样的 import numpy as np from numpy fft import fft2 ifft2 def wiener filter img kernel K 10 d