图像降噪算法——维纳滤波

2023-05-16

图像降噪算法——维纳滤波

  • 图像降噪算法——维纳滤波
    • 1. 基本原理
    • 2. C++代码实现
    • 3. 结论

图像降噪算法——维纳滤波

维纳滤波是在频域中处理图像的一种算法,是一种非常经典的图像增强算法,不仅可以进行图像降噪,还可以消除由于运动等原因带来的图像模糊。

1. 基本原理

在图像拍摄过程中由于各种原因会造成图像退化,图像退化模型如下: g ( x , y ) = h ( x , y ) ⋆ f ( x , y ) + η ( x , y ) g(x, y)=h(x, y) \star f(x, y)+\eta(x, y) g(x,y)=h(x,y)f(x,y)+η(x,y)其中, ⋆ \star 为卷积符号, f ( x , y ) f(x,y) f(x,y)为输入图像, g ( x , y ) g(x,y) g(x,y)为退化图像, h ( x , y ) h(x,y) h(x,y)为退化函数, η ( x , y ) \eta(x,y) η(x,y)为加性噪声,将上式进行傅里叶变换有: G ( u , v ) = H ( u , v ) F ( u , v ) + N ( u , v ) G(u, v)=H(u, v) F(u, v)+N(u, v) G(u,v)=H(u,v)F(u,v)+N(u,v)根据傅里叶变换的特性,空间域中的卷积相当于频率域中的乘积

(1) 如果不考虑退化函数,图像退化模型就简化为图像噪声模型: g ( x , y ) = f ( x , y ) + η ( x , y ) g(x, y)=f(x, y)+\eta(x, y) g(x,y)=f(x,y)+η(x,y)图像增强问题成为单纯的图像去噪问题,可以通过空间域滤波等众多方法解决。

(2) 如果不考虑加性噪声,图像退化模型就简化为: g ( x , y ) = h ( x , y ) ⋆ f ( x , y ) g(x, y)=h(x, y) \star f(x, y) g(x,y)=h(x,y)f(x,y)这种问题可以通过逆滤波解决,即通过傅里叶变化以及阵列除法即可获得恢复后的图像频谱 F ^ ( u , v ) \hat{F}(u, v) F^(u,v) F ^ ( u , v ) = G ( u , v ) H ( u , v ) \hat{F}(u, v)=\frac{G(u, v)}{H(u, v)} F^(u,v)=H(u,v)G(u,v)那么 H ( u , v ) H(u,v) H(u,v)怎么获得呢?《数字图像处理》中的方法有观察估计、实验估计和建模估计,例如建模估计中可以通过运动数学模型将退化函数构造为: H ( u , v ) = T π ( u a + v b ) sin ⁡ [ π ( u a + v b ) ] e − j π ( u a + v b ) H(u, v)=\frac{T}{\pi(u a+v b)} \sin [\pi(u a+v b)] \mathrm{e}^{-\mathrm{j} \pi(u a+v b)} H(u,v)=π(ua+vb)Tsin[π(ua+vb)]ejπ(ua+vb)

(3) 如果退化函数和加性噪声都考虑,空域滤波器无法解决图像退化问题,逆滤波效果因为噪声的存在会变得非常差,这个时候就需要用到维纳滤波,(维纳滤波的推导写在结论中)维纳滤波公式如下: F ^ ( u , v ) = [ 1 H ( u , v ) ∣ H ( u , v ) ∣ 2 ∣ H ( u , v ) ∣ 2 + S η ( u , v ) / S f ( u , v ) ] G ( u , v ) \hat{F}(u, v)=\left[\frac{1}{H(u, v)} \frac{|H(u, v)|^{2}}{|H(u, v)|^{2}+S_{\eta}(u, v) / S_{f}(u, v)}\right] G(u, v) F^(u,v)=[H(u,v)1H(u,v)2+Sη(u,v)/Sf(u,v)H(u,v)2]G(u,v)其中,
S η ( u , v ) = ∣ N ( u , v ) ∣ 2 S_{\eta}(u, v)=|N(u, v)|^{2} Sη(u,v)=N(u,v)2为噪声的功率谱,这个我们可以通过用户输入的方差构造一个噪声图像 N ( u , v ) N(u, v) N(u,v)并计算功率谱;
S f ( u , v ) = ∣ F ( u , v ) ∣ 2 S_{f}(u, v)=|F(u, v)|^{2} Sf(u,v)=F(u,v)2为输入图像的功率谱,这里乍一看会觉得有点问题,我们如果知道输入图像还需要滤波干嘛?我们当然不知道输入图像,因为真实图像的功率谱都是类似的,因此我们使用一个参考图像计算功率谱即可,在下面的例子中就是使用的lena的灰度图作为参考图像;
下面的例子中我们还对退化函数进行了简化,将退化函数置为1,因此维纳滤波公式简化为: F ^ ( u , v ) = [ S f ( u , v ) S f ( u , v ) + S η ( u , v ) ] G ( u , v ) \hat{F}(u, v)=\left[\frac{S_{f}(u, v)}{S_{f}(u, v)+S_{\eta}(u, v)}\right] G(u, v) F^(u,v)=[Sf(u,v)+Sη(u,v)Sf(u,v)]G(u,v)

2. C++代码实现

下面基于OpenCV实现维纳滤波

Mat Denoise::WienerFilter(const Mat &src, const Mat &ref, int stddev)
{
    //这些图片是过程中会用到的,pad是原图像0填充后的图像,cpx是双通道频域图,mag是频域幅值图,dst是滤波后的图像
    Mat pad, cpx, dst;

    //获取傅里叶变化最佳图片尺寸,为2的指数
    int m = getOptimalDFTSize(src.rows);
    int n = getOptimalDFTSize(src.cols);

    //对原始图片用0进行填充获得最佳尺寸图片
    copyMakeBorder(src, pad, 0, m-src.rows, 0, n-src.cols, BORDER_CONSTANT, Scalar::all(0));

    //获得参考图片频谱
    Mat tmpR(pad.rows, pad.cols, CV_8U);
    resize(ref, tmpR, tmpR.size());
    Mat refSpectrum = GetSpectrum(tmpR);

    //获得噪声频谱
    Mat tmpN(pad.rows, pad.cols, CV_32F);
    randn(tmpN, Scalar::all(0), Scalar::all(stddev));
    Mat noiseSpectrum = GetSpectrum(tmpN);

    //对src进行傅里叶变换
    Mat planes[] = {Mat_<float>(pad), Mat::zeros(pad.size(), CV_32F)};
    merge(planes, 2, cpx);
    dft(cpx, cpx);
    split(cpx, planes);

    //维纳滤波因子
    Mat factor = refSpectrum / (refSpectrum + noiseSpectrum);
    multiply(planes[0], factor, planes[0]);
    multiply(planes[1], factor, planes[1]);

    //重新合并实部planes[0]和虚部planes[1]
    merge(planes, 2, cpx);

    //进行反傅里叶变换
    idft(cpx, dst, DFT_SCALE | DFT_REAL_OUTPUT);

    dst.convertTo(dst, CV_8UC1);
    return dst;
}


Mat Denoise::GetSpectrum(const Mat &src)
{
    Mat dst, cpx;
    Mat planes[] = {Mat_<float>(src), Mat::zeros(src.size(), CV_32F)};
    merge(planes, 2, cpx);
    dft(cpx, cpx);
    split(cpx, planes);
    magnitude(planes[0], planes[1], dst);
    //频谱就是频域幅度图的平方
    multiply(dst, dst, dst);
    return dst;
}

下面是运行结果:
首先是原图:
在这里插入图片描述
添加上高斯噪声后:
在这里插入图片描述
维纳滤波的效果:
在这里插入图片描述
这个效果看上去有点神奇…

3. 结论

  1. 从滤波结果看,和频域的高斯低通滤波是不同的,从频域图上看其实就是筛掉了不同的高频信号

  2. 咱学知识就要学明白,这里我们把维纳滤波的推导再过一遍:
    维纳滤波是采用优化的方法推导的的,优化的目标是是的估计图像 F ^ ( u , v ) \hat{F}(u,v) F^(u,v)和参考图像 F ( u , v ) F(u,v) F(u,v)(或者说是输入图像)频谱的均方差最小,即: e = E { ∣ F ( u , v ) − F ^ ( u , v ) ∣ 2 } e=E\{|F(u,v)-\hat{F}(u,v)|^{2}\} e=E{F(u,v)F^(u,v)2}将估计图像频谱进行替换: e = E { ∣ F ( u , v ) − X ( u , v ) G ( u , v ) ∣ 2 } = E { ∣ F ( u , v ) − X ( u , v ) [ H ( u , v ) F ( u , v ) + N ( u , v ) ] ∣ 2 } = E { ∣ [ 1 − X ( u , v ) H ( u , v ) ] F ( u , v ) − X ( u , v ) N ( u , v ) ∣ 2 } \begin{aligned} e &=E\{|F(u,v)-X(u,v) G(u,v)|^{2}\} \\ &=E\{|F(u,v)-X(u,v) [H(u, v) F(u, v)+N(u, v)]|^{2}\} \\ &=E\{|[1-X(u,v)H(u, v) ] F(u, v)-X(u,v)N(u, v)|^{2}\} \end{aligned} e=E{F(u,v)X(u,v)G(u,v)2}=E{F(u,v)X(u,v)[H(u,v)F(u,v)+N(u,v)]2}=E{[1X(u,v)H(u,v)]F(u,v)X(u,v)N(u,v)2}其中, X ( u , v ) X(u,v) X(u,v)就是我们需要估计的维纳滤波系数,然后对平方进行展开 e = [ 1 − X ( u , v ) H ( u , v ) ] [ 1 − X ( u , v ) H ( u , v ) ] ∗ × E { ∣ F ( u , v ) ∣ 2 } − [ 1 − X ( u , v ) H ( u , v ) ] X ∗ ( u , v ) × E { F ( u , v ) N ∗ ( u , v ) } − X ( u , v ) [ 1 − X ( u , v ) H ( u , v ) ] ∗ × E { F ( u , v ) ∗ N ( u , v ) } + X ( u , v ) X ∗ ( u , v ) × E { ∣ N ( u , v ) ∣ 2 } \begin{aligned} e &=[1-X(u,v)H(u, v) ][1-X(u,v)H(u, v) ]^*×E\{|F(u,v)|^{2}\} \\ &-[1-X(u,v)H(u, v) ]X^*(u,v)× E\left\{F(u,v)N^*(u, v)\right\} \\ &-X(u,v)[1-X(u,v)H(u, v)]^*×E\left\{F(u,v)^*N(u, v)\right\} \\ &+X(u,v)X^*(u,v)×E\{|N(u, v)|^{2}\} \end{aligned} e=[1X(u,v)H(u,v)][1X(u,v)H(u,v)]×E{F(u,v)2}[1X(u,v)H(u,v)]X(u,v)×E{F(u,v)N(u,v)}X(u,v)[1X(u,v)H(u,v)]×E{F(u,v)N(u,v)}+X(u,v)X(u,v)×E{N(u,v)2}其中,由于噪声和信号是独立无关的,因此 E { F ( u , v ) N ( u , v ) } = E { F ( u , v ) N ( u , v ) } = 0 E\left\{F(u,v)N(u, v)\right\}=E\left\{F(u,v) N(u, v)\right\}=0 E{F(u,v)N(u,v)}=E{F(u,v)N(u,v)}=0定义如下功率谱有: S f ( u , v ) = E { ∣ F ( u , v ) ∣ 2 } S η ( u , v ) = E { ∣ N ( u , v ) ∣ 2 } \begin{array}{l} S_f(u,v)=E\{|F(u,v)|^{2}\} \\ S_\eta(u,v)=E\{|N(u, v)|^{2}\} \end{array} Sf(u,v)=E{F(u,v)2}Sη(u,v)=E{N(u,v)2}于是有: e = [ 1 − X ( u , v ) H ( u , v ) ] [ 1 − X ( u , v ) H ( u , v ) ] ∗ S f ( u , v ) + X ( u , v ) X ∗ ( u , v ) ( f ) S η ( u , v ) e=[1-X(u,v)H(u, v) ][1-X(u,v)H(u, v) ]^*S_f(u,v)+X(u,v)X^*(u,v)(f) S_\eta(u,v) e=[1X(u,v)H(u,v)][1X(u,v)H(u,v)]Sf(u,v)+X(u,v)X(u,v)(f)Sη(u,v)然后对 X ( u , v ) X(u,v) X(u,v)求导 d ( e ) d X ( u , v ) = X ∗ ( u , v ) S η ( u , v ) − X ( u , v ) [ 1 − X ( u , v ) H ( u , v ) ) ] ∗ S f ( u , v ) = 0 \frac{\mathrm{d}(e)}{\mathrm{d} X(u,v)}=X^{*}(u,v)S_\eta(u,v)-X(u,v)[1-X(u,v)H(u, v))]^{*}S_f(u,v)=0 dX(u,v)d(e)=X(u,v)Sη(u,v)X(u,v)[1X(u,v)H(u,v))]Sf(u,v)=0求解可获得维纳滤波公式。

有问题欢迎交流~

此外,这里我写一个各种算法的总结目录图像降噪算法——图像降噪算法总结,对图像降噪算法感兴趣的同学欢迎参考

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

图像降噪算法——维纳滤波 的相关文章

  • Linux\Ubuntu20下解压\提取realsense-viewer的录制文件xxx.bag

    最近用realsense获取rgb和depth图像 xff0c 其中用到了有ui界面的realsense viewer 这里附上RealSense SDK 2 0的github链接 直接在命令行输入即可打开realsense viewer
  • Unity基于思岚A2雷达开发-----配置教程

    说明 此教程是根据视频总结的 xff0c 配置包是厂商提供的 1 图片中圈出来为雷达校准软件 2 打开如下 xff0c 左上角按钮功能依次是设置 扫描 划定互动区域 保存 停止 加载以前扫描文件 右上角白色圆盘调整角度 xff0c 左右箭头
  • Altium Designer20-柔性PCB绘制技巧

    Altium Designer2020 柔性PCB绘制技巧 注 xff1a 教程所用PCB随意找的 xff0c 并没有完全绘制完 xff0c 大家学习PCB折弯方法即可 1 打开PCB 点击视图 gt 板子规划模式1 xff0c 如下图所示
  • SolidWorks2020小金球

    SolidWorks2020小金球 注 xff1a SolidWorks用户对SolidWorks渲染RealView功能的一个简单的叫法 小金球 xff0c 是一款功能功能强大的图形特效工具 xff0c 它可以快速的通过SOLIDWORK
  • QT5.14.1程序打包超级详细教程(windeployqt工具+Enigma Virtual Box)

    QT5 14 1程序打包超级详细教程 windeployqt工具 43 Enigma Virtual Box 注 xff1a 1 本教程使用QT5 14 1版本 xff0c 使用官网自带的windeployqt打包工具 xff0c 可以将文
  • c# RabbitMQ 和 ActiveMQ windows环境的配置和使用

    c RabbitMQ 和 ActiveMQ windows环境的配置和使用 RabbitMQ 1 下载配置 erlang 确保 39 ERLANG HOME 39 在环境变量中配置 2 下载安装 rabbit mq 3 激活 managem
  • SolidWorks2020绘制XT30PW模型

    SolidWorks2020绘制XT30PW模型 注 xff1a 模型根据数据手册绘制下载链接 1 2 3
  • Vmware安装Ubuntu16.0.4出现Assuming drive cache: write through和1920X1080分辨率调节问题

    Vmware安装Ubuntu16 0 4出现Assuming drive cache write through和1920X1080分辨率调节问题 注 xff1a 用Vmare安装Ubuntu16几乎都会遇到下面两个问题 xff0c 跟着我
  • ubuntu QT出现qt creater能编译但qmake编译后不能完全运行

    注释 xff1a 最开始用QT 编译程序 xff0c 但是最后需要将用命令行来编译 xff0c 在使用qmake过程中出现编译能通过但是运行程序也能跑起来 xff0c 但是就感觉卡在哪里了 xff0c 每次需要在QT编译器中重新编译才能运行
  • VScode 代码行数统计

    VScode 代码行数统计 1 安装vs code counter 2 按住按Ctrl 43 Shift 43 P 在命令输入 xff1a Count lines in workspace并回车 3 自动生成 VSCodeCounter x
  • 个人主页(包含项目经历、实习经历、竞赛经历)

    个人主页 注 xff1a 个人主页中主要包含项目经历 实习经历 竞赛经历等方面的照片及文字说明 项目经历 一 基于声源目标识别与定位的微型平台设计 图1 图2 图3 图1 3声源目标识别与定位平台 二 基于STM32的六足仿生机器人设计 图
  • UBUNTU编译运行RTKLIB

    RTKLIB在ubuntu下没有图形用户界面 xff08 GUI xff09 xff01 RTKLIB作为一个功能强大的工具 xff0c 我一直以为它在ubuntu下和win10下是一个样子 xff0c 所以想着用ubuntu下的编译器去编
  • 关于makefile与CMakeList的理解

    为了编译某一工程中的众多 c文件搞出来一个makefile可以批量编译 xff1b Linux下用Cmake也即CMakeLists txt文件 作者写的很清晰易懂
  • c++版本详表

    1 语言标准 版本代目版本号年份第一版c 43 43 981998第二版c 43 43 032003第三版c 43 43 112011第四版c 43 43 142014第五版c 43 43 172017第六版待定待定 2 visual st
  • ffmpeg常用命令

    1 rtsp into mp4 ffmpeg exe i 34 rtsp username password 64 192 168 1 183 554 34 f mp4 r 25 an 640x480 ss 600 t 600 s 34 t
  • http包详解

    位于应用层的http协议 什么也不多说了 xff0c 马上放个图看看 请求方法 xff0c 主要是 xff1a get xff1a 获取 post xff1a 提交 请求头 xff1a User Agent xff1a 产生请求的浏览器类型
  • linux下编译C++项目

    include CheckCXXCompilerFlag CHECK CXX COMPILER FLAG std 61 c 43 43 11 COMPILER SUPPORTS CXX11 CHECK CXX COMPILER FLAG s
  • www总结

    一 www服务器 1 什么是www xff1a www是world wide web的缩写 xff0c 也就是全球信息广播的意思 通常说的上网就是使用www来查询用户所需要的信息 www可以结合文字 图形 影像以及声音等多媒体 xff0c
  • matlab基础练习作业(1)

    要期末考试了 xff0c 整理一下平时的题 作业 xff11 1 写出完成下列操作的命令 1 将矩阵A第2 5行中第1 3 5列元素赋给矩阵B B 61 A 2 5 1 3 5 或者B 61 A 2 3 4 5 1 3 5 2 删除矩阵A的
  • PHP中使用cURL实现进行Post请求 ssl 双向认证

    span class token comment 64 param string url 接收数据的api 64 param string vars 提交的数据 64 param int second 要求程序必须在 second 秒内完成

随机推荐

  • 大端字节序与小端字节序 (网络字节序与主机字节序)

    大端字节序与小端字节序 1 简介2 判断机器字节序 xff08 C C 43 43 xff09 3 主机字节序与网络字节序的转换4 IP地址与网络字节序的转换 1 简介 字节序分为大端字节序 xff08 big endian xff09 和
  • Noetic安装ros_canopen

    建立workspace mkdir span class token operator span p canopen span class token operator span scr cd canopen catkin make 下载n
  • ROS学习初始化ws下catkin_make必须有src生成devel和build

    安装虚拟机开启intel vt 创建工作空间 first ws src catkin make在ws下生成devel和build 创建package 在src下添加package catkin create pkg hello ros ro
  • Pyhon : 爬虫Requests高级用法--证书

    客户端证书 你也可以指定一个本地证书用作客户端证书 xff0c 可以是单个文件 xff08 包含密钥和证书 xff09 或一个包含两个文件路径的元组 xff1a requests get https kennethreitz org cer
  • 【px4】运行mavsdk中的offboard example

    运行MAVSDK中的offboard例子时无人机不执行 想控制无人机前后左右移动 xff0c 在按照官方教程实现offboard 插件的时候 发现用action插件能正常起飞和降落 但是一旦执行到offboard的插件代码的时候就会自动降落
  • MDF does not reside in a read-only database or filegroup

    错误信息 The file 34 MDF 34 is compressed but does not reside in a read only database or filegroup The file must be decompre
  • Python复习笔记4——文件和目录操作

    一 文件读写 1 1 读文件 xff08 1 xff09 打开文件 使用Python内置的open 函数 xff0c 传入文件名和标示符 xff0c 打开一个文件对象 xff1a span class token operator gt g
  • Python复习笔记5——常用模块

    一 内建模块 1 1 datetime日期时间 xff08 1 xff09 导入模块 span class token keyword from span datetime span class token keyword import s
  • COLMAP+OpenMVS实现物体三维重建mesh模型

    一 环境准备 1 COLMAP 进入COLMAP官网 xff0c 打开下载页面 xff0c 下载COLMAP程序 2 OpenMVS OpenMVS可以自己从源码下载进行编译 如果觉得编译openmvs可能要费点时间 xff0c 那也可以直
  • 解决ubuntu火狐无法上网问题

    之前安装Ubuntu时是可以上网的 xff0c 呆了一个月没怎么用突然不能搜索了 xff0c 记录一下 xff0c 已解决 只需一条命令 打开终端 xff0c 输入 sudo apt get install firefox 问题解决啦 xf
  • C语言基本数据类型int, short int, long int, long long int, unsigned int, signed int等解析

    一 普通int类型 int类型是有符号整型 xff0c 即int类型的值必须是整数 xff0c 可以是正整数 xff0c 负整数 xff0c 零 int类型取值范围因计算机系统而异 早起的16位IBM PC兼容机使用16位来存储一个int值
  • Docker容器内更新apt-get 国内加速

    Docker容器内更新源apt get的方法 由于不使用国内镜像网速缓慢 xff0c 所以使用国内镜像加速就很必要了 xff0c 但是经过博主测试大部分apt get加速都是针对Ubuntu 的 xff0c 根本解决不了Docker 容器内
  • STM32F4 422串口通信

    STM32F429 422串口通信 422串口的硬件原理图如下 xff1a 422串口和232串口不同的是引脚的电平控制 xff0c 还有DE是发送使能 xff0c 置高即可 xff1a RE是接收使能 xff0c 置低即可 422接出来的
  • Java基础学习记录

    一 基础DOS操作 dir xff1a directory 列出当前目录内容 md xff1a make directory 创建目录 rd xff1a remove directory 删除目录 cd xff1a change direc
  • 6、杂项:rtk原理简要说明

    目录 x1f345 点击这里查看所有博文 随着自己工作的进行 xff0c 接触到的技术栈也越来越多 给我一个很直观的感受就是 xff0c 某一项技术 经验在刚开始接触的时候都记得很清楚 往往过了几个月都会忘记的差不多了 xff0c 只有经常
  • 树莓派控制直流电机

    古月金真 1 直流电机 直流电机是一种将直流电能转换为机械能的装置 xff0c 被广泛的用于驱动各种设备 xff0c 如电风扇 遥控小车 电动车窗等 xff0c 在控制设备运转领域中 xff0c 它是不可或缺的一种设备 小型直流电机的的电压
  • SVN创建指定版本号的分支

    SVN创建分支下面三个选择的具体含义 xff1a 最新版本 xff08 HEAD revision in therepository xff09 直接从版本库中最新创建 xff0c 由于不需要从你的工作拷贝中传输数据 xff0c 创建过程会
  • 图像降噪算法——图像降噪算法总结

    图像降噪算法 图像降噪算法总结 图像降噪算法 图像降噪算法总结 图像降噪算法 图像降噪算法总结 前面这段时间我看了几篇和图像降噪相关的Review xff0c 给我的感觉就是SLAM这一研究领域像是一片汪洋 xff0c 而图像降噪领域则是另
  • 图像降噪算法——图像噪声模型

    图像降噪算法 图像噪声模型 图像降噪算法 图像噪声模型1 图像噪声建模2 C 43 43 代码实现3 结论 图像降噪算法 图像噪声模型 1 图像噪声建模 首先 xff0c 我们要区分图像传感器噪声和图像噪声 xff0c 图像传感器噪声我在博
  • 图像降噪算法——维纳滤波

    图像降噪算法 维纳滤波 图像降噪算法 维纳滤波1 基本原理2 C 43 43 代码实现3 结论 图像降噪算法 维纳滤波 维纳滤波是在频域中处理图像的一种算法 xff0c 是一种非常经典的图像增强算法 xff0c 不仅可以进行图像降噪 xff