深度学习结合非局部均值滤波的图像去噪算法

2023-10-30

其实这是半年之前完成的内容,一直懒着没有总结,今天看了看代码,发觉再不总结自己以后都看不懂了,故整理如下。

非局部均值是一种基于块匹配来确定滤波权值的。即先确定一个块的大小,例如7x7,然后在确定一个搜索区域,例如15x15,在15x15这个搜索区域中的每一个点,计算7x7的窗口与当前滤波点7x7窗口的相似性(使用绝对差和SAD,一般而言,窗口中各点的差值还需要乘以经高斯核生成的权重参数,离中心点越近,权重值越大一些),然后根据相似性值使用指数函数生成窗口中心点的权重参数,相似性越高,该中心点的权重越大,最后各中心点的加权平均就是最终滤波图像,能获得很好的视觉效果。

非局部均值的成功之处主要在于充分利用了块的相似性,而后续步骤由相似性计算对应权重值,按照经验使用指数函数,其参数h有着至关重要的作用,许多论文也是在h上面做改进。如果我们跳出加权平均和指数函数的思路,完全可以将含噪图像所有相邻点的像素值、相似性值、距离等做为输入送给深度学习网络,将原图像值作为输出进行训练啊,训练好的模型就可以直接用于滤波。

下面附一个简化版的python代码,经实测改进后的算法比原生的非局部均值滤波要好,里面的网络模型过于简单,想提升效果的自己修改调优吧。

注意使用的是python3环境

#coding:utf8
import cv2, datetime,sys,glob
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

from keras.models import Sequential, model_from_json
from keras.layers import Dense, Activation,Dropout,Flatten,Merge
from keras.callbacks import EarlyStopping
from keras.layers.convolutional import Convolution2D,Convolution3D

def psnr(A, B):
    return 10*np.log(255*255.0/(((A.astype(np.float)-B)**2).mean()))/np.log(10)
def double2uint8(I, ratio=1.0):
    return np.clip(np.round(I*ratio), 0, 255).astype(np.uint8)

def GetNlmData(I, templateWindowSize=4,  searchWindowSize=9):
    f = int(templateWindowSize / 2)
    t = int(searchWindowSize / 2)
    height, width = I.shape[:2]
    padLength = t + f
    I2 = np.pad(I, padLength, 'symmetric')
    I_ = I2[padLength - f:padLength + f + height, padLength - f:padLength + f + width]

    res = np.zeros((height, width, templateWindowSize+2, t+t+1, t+t+1))
    for i in range(-t, t + 1):
        for j in range(-t, t + 1):
            I2_ = I2[padLength + i - f:padLength + i + f + height, padLength + j - f:padLength + j + f + width]
            for kk in range(templateWindowSize):
                kernel = np.ones((2*kk+1, 2*kk+1))
                kernel = kernel/kernel.sum()
                res[:, :, kk, i+t, j+t] = cv2.filter2D((I2_-I_) ** 2, -1,  kernel)[f:f + height, f:f + width]
            res[:, :, -2, i+t, j+t] = I2_[f:f + height, f:f + width]-I
            res[:, :, -1, i+t, j+t] = np.exp(-np.sqrt(i**2+j**2))
    print(res.max(), res.min())
    return res

def zmTrain(trainX, trainY):
    model = Sequential()
    if 1:
        model.add(Dense(100, init='uniform', input_dim=trainX.shape[1]))
        model.add(Activation('relu'))
        model.add(Dense(50))
        model.add(Activation('relu'))
        model.add(Dense(1))
        model.compile(loss='mse', optimizer='adam', metrics=['accuracy'])
    else:
        with open('model.json', 'rb') as fd:
            model = model_from_json(fd.read())
            model.load_weights('weight.h5')
            model.compile(loss='msle', optimizer='adam', metrics=['accuracy'])

    early_stopping = EarlyStopping(monitor='val_loss', patience=5)
    hist =model.fit(trainX, trainY, batch_size=150, epochs=200, shuffle=True, verbose=2, validation_split=0.1
                    ,callbacks=[early_stopping])
    print(hist.history)

    res = model.predict(trainX)
    res = np.clip(np.round(res.ravel() * 255), 0, 255)
    print(psnr(res, trainY*255))
    return model
if __name__ == '__main__':
    sigma = 20.0
    if 1:                         #这部分代码用于训练模型
        trainX = None
        trainY = None

        for d in glob.glob('./img/_*'):
            I = cv2.imread(d,0)
            I1 = double2uint8(I + np.random.randn(*I.shape) *sigma)
            data = GetNlmData(I1.astype(np.double)/255)
            s = data.shape
            data.resize((np.prod(s[:2]), np.prod(s[2:])))
            
            if trainX is None:
                trainX = data
                trainY = ((I.astype(np.double)-I1)/255).ravel()
            else:
                trainX = np.concatenate((trainX, data), axis=0)
                trainY = np.concatenate((trainY,  ((I.astype(np.double)-I1)/255).ravel()), axis=0)
            
        
        model = zmTrain(trainX, trainY)
        with open('model.json', 'wb') as fd:
            #fd.write(model.to_json())
            fd.write(bytes(model.to_json(),'utf8'))
        model.save_weights('weight.h5')
    if 1:                       #滤波
        with open('model.json', 'rb') as fd:
            model = model_from_json(fd.read().decode())
            model.load_weights('weight.h5')
        I = cv2.imread('lena.jpg', 0)
        I1 = double2uint8(I + np.random.randn(*I.shape) * sigma)

        data= GetNlmData(I1.astype(np.double)/255)
        s = data.shape
        data.resize((np.prod(s[:2]), np.prod(s[2:])))
        res = model.predict(data)
        res.resize(I.shape)
        res = np.clip(np.round(res*255 +I1), 0, 255)
        print('nwNLM PSNR', psnr(res, I))
        res = res.astype(np.uint8)
        cv2.imwrite('cvOut.bmp', res)


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

深度学习结合非局部均值滤波的图像去噪算法 的相关文章

  • 周志华《机器学习》课后习题解答系列(六):Ch5.10 - 卷积神经网络实验

    本系列相关答案和源代码托管在我的Github上 PY131 Machine Learning ZhouZhihua 卷积神经网络实验 手写字符识别 注 本题程实现基于python theano 这里查看完整代码和数据集 1 基础知识回顾 1
  • 使用PowerShell脚本来一键开启、关闭FTP服务

    可以使用PowerShell脚本来实现这一目标 下面是两个简单的PowerShell脚本 一个用于开启FTP服务 另一个用于关闭FTP服务 开启FTP服务 保存以下脚本为 Enable FTP ps1 开启IIS和FTP功能 Enable
  • Nextjs 的 App Router 路由模式核心概念简介

    Nextjs App Router 简介 Next js 13 引入了新的应用路由器 它建立在服务端组件之上 支持布局 嵌套路由 加载状态 错误处理等等 本文将介绍 App Router 新路由模型的基本概念 术语 树 Tree 一种用于可
  • neo4j--Cypher语法练习(LOAD CSV)

    1 21 LOAD CSV LOAD CSV用于从CSV文件中导入数据 CSV文件的URL可以由FROM后面紧跟的任意表达式来指定 需要使用AS来为CSV数据指定一个变量 LOAD CSV支持以gzip Deflate和ZIP压缩的资源 C
  • el-form表单回车提交,浏览器会刷新页面

    当el from 只有一个输入框时候 回车提交表单 刷新页面 原因 由于当表单只有一文本框时 按下回车将会触发表单的提交事件 从而导致页面刷新 解决办法 在 el from 加上 submit native prevent
  • 【经典】华为远程机试题分享(跟进)

    在上一篇博客中有说到面试的具体事儿 昨晚那种方法做出来之后 感觉可读性不好 也就是一般情况下很难看懂代码 所以接近睡着时我又想到一个办法比较简单 而且易懂 所以写这篇博客和大家分享一下吧 具体就围绕下图这个核心问题来做 其实我的想法很简单
  • 【Espruino】NO.18 使用L298N驱动直流电机

    http blog csdn net qwert1213131 article details 38584743 本文属于个人理解 能力有限 纰漏在所难免 还望指正 小鱼有点电 Espruino中文社区 小学时代玩过玩具四驱车 各种奇葩霸气
  • ChatGPT写小论文

    ChatGPT写小论文 只是个人对写小论文心得 从知乎 知网自己总结的 有问题 可以留个言我改一下 别删我的东西啊CSDN 文章目录 ChatGPT写小论文 1 写小论文模仿实战 狗头 0 小论文组成 1 好论文前提 2 标题 3 摘要 4
  • Transformer(三)--论文实现:transformer pytorch 代码实现

    转载请注明出处 https blog csdn net nocml article details 124489562 本系列传送门 Transformer 一 论文翻译 Attention Is All You Need 中文版 Tran
  • games101笔记 Shading

    什么是shading 不同的物体应用不同的材质的过程 就是计算出物体具体应该在的地方 物体的光照 物体本身应该有的材质 Blinn Phong Reflectance Model Blinn Phong反射模型 Blinn Phong Re
  • MySql执行顺序及执行计划

    一 mySql的执行顺序 mysql执行sql的顺序从 From 开始 以下是执行的顺序流程 1 FROM table1 left join table2 on 将table1和table2中的数据产生笛卡尔积 生成Temp1 2 JOIN
  • Spring和springMVC启动流程

    首先Spring是建立在Servlet容器之上的 所有web工程的初始位置都是在web xml文件中 它配置了servlet的上下文 context 和监听器 listener spring的启动过程其实就是ioc的启动过程 1 首先初始化
  • linux下出现ping:unknown host www.baidu.com问题时的解决办法——ubuntu下局域网络的配置

    如果ping域名的时候出现ping unknown host xxx xxx 但是ping IP地址的时候可以通的话 可知是dns服务器没有配置好 查看一下配置文件 etc resolv conf 里面是否有nameserver xxx x
  • 算力和硬件的关系_算力就是生产力:中国AI算力占全球三成

    12月15日 IDC与浪潮集团联合发布了 2020 2021中国人工智能计算力发展评估报告 报告从旨在评估中国人工智能发展的现状 为推动产业AI化发展提供极具价值的参考依据和行动建议 据报告显示 预计2020 年中国AI市场规模将达到 62
  • chatgpt(0)-pycharm-vscode安装使用插件Codeium-bito

    1 pycharm codeium 下载插件 codeium 登录 一直出现 Log In Codeium Free AI Code Completion Chat 2 pycharm bito 3 vscode bito 下载安装 注册登
  • 十六进制加法

    十六进制加法逢16进1位 注意 进位的那个位是 和 16 举例 0x21 0x3F 60 而不是 0x21 0x3F 6F
  • Proguard混淆工具使用方法图文说明

    Proguard的理论知识请看这篇文章 http www cnblogs com cr330326 p 5534915 html 1 下载Proguard 官网地址 http proguard sourceforge net 不墙很难打开
  • Sonar代码质量管理

    一 简介 1 1 什么是Sonar Sonar是一个用于代码质量管理的开源平台 用于管理代码的质量 是一个Web系统 展现了静态代码扫描的结果 通过插件形式可以支持二十几种语言的代码质量检测 通过多个维度的检查了快速定位代码中潜在的或者明显
  • fopen 参数'rb' 与'rb+'引发的黑色血案

    目录 一 背景 二 代码说明 1 下面是出错的代码 2 如何变正常的 三 问题分析 1 关于rb与rb 的区别 2 关于fread的两种形式说明 3 原因分析 一 背景 为了把windows上的算法库移植到linux上 文件读写部分去掉了C
  • IO流(异常的处理)

    IO流 概述 IO流 又叫输入输出流 当我们将内存中的数据写到硬盘上时 这个过程叫输出流 Output 当我们将硬盘上的数据读取到内存中时 叫做输入流 Input 流本身是一个抽象概念 是 对数据传输的总称 也就是说 数据在设备键的传输 叫

随机推荐

  • 跟李沐学AI之注意力机制+transformer

    注意力机制 注意力提示 注意力的可视化 注意力汇聚 平均汇聚 非参数注意力汇聚 带参数注意力汇聚 注意力评分函数 掩蔽softmax操作 加性注意力 缩放点积注意力 Bahdanau注意力 多头注意力机制 自注意力和位置编码 transfo
  • (java)leetcode-445 Add Two Numbers II(两数相加 II)

    题目描述 给你两个 非空 链表来代表两个非负整数 数字最高位位于链表开始位置 它们的每个节点只存储一位数字 将这两数相加会返回一个新的链表 你可以假设除了数字 0 之外 这两个数字都不会以零开头 进阶 如果输入链表不能修改该如何处理 换句话
  • jupyter的安装与使用

    目录 一 jupyter的介绍 二 安装与运行 1 使用Anaconda安装 2 使用pip命令安装 1 首先通过win R打开命令符输入pip version 查看电脑python环境 编辑 2 输入jupyter notebook的命令
  • 有时OPEN***提示报错,如下错误及解决方法

    Dec 14 11 40 47 nfs12 open 31685 TLS ERROR BIO read tls read plaintext error error 14090086 SSL routines SSL3 GET SERVER
  • VScode绑定码云并向仓库上传代码

    文章目录 一 下载git 二 使用步骤 1 Git的全局配置 2 配置Git 3 VScode的配置 总结 一 下载git 下载链接 点击download即可 下载完成后 按照默认安装即可 二 使用步骤 1 Git的全局配置 代码如下 示例
  • 卸载Ubuntu自带的Qt4和Qt5

    执行如下操作 首先移除库 sudo apt get remove qtcreator sudo apt get remove qt5 上面是移除qt5 移除qt4的时候把qt5改成qt4就可以了 下面也是一样的 移除依赖文件 sudo ap
  • 《Python进阶系列》一:使用Python包组织代码

    使用Python包 package 组织代码 最近在看 Python入门技能树 时 看到了Python包组织代码觉得很有意思 特地写个笔记总结一下 quad Python 通过包 package 的方式来组织代码 包是一种特殊的模块 mod
  • vue3-ElmentPlus封装通用表格-含单元格操作-多选-分页器

    Sam9029的CSDN博客主页 Sam9029的博客 CSDN博客 JS学习 CSS学习 Vue 2领域博主 恭喜你 若此文你认为写的不错 不要吝啬你的赞扬 求收藏 求评论 求一个大大的赞 已经有很久没有写文章了 贪玩 摆烂 不想动 低情
  • GAN初识

    1 生成对抗网络GAN简介 1 1 生成器 G Z 接受随机噪声Z作为输入生成仿品 并训练自己去欺骗判别器D 让D以为G Z 产生的任何数据都是真实的 1 2 判别器 D Y 可以基于真品和仿品来判断仿造品的仿真程度 通常值越靠近0表示越真
  • 数字信号处理理解

    心得体会 给自己看的 傅里叶变换 FT FS DTFT DFS 傅里叶变换虚部理解 每个函数都可以写成奇分量 偶分量 偶分量用很多cos合成 奇分量用很多sin合成 频谱上 实轴上冲激函数就是由这些cos合成 那如果是sin合成的呢 那就是
  • mkdocs 编辑及启动

    mkdocs 编辑及启动 新建项目以及 md 文件之后 如图 具体代码为 mkdocs 核心配置代码 编写完成之后 编译 cd mkdocs docs make html 成功之后 会自动生成 build文件 启动 firefox buil
  • elementUI中的el-form常用校验规则

    elementUI中的el form常用校验规则 校验使用方式 rules name required true message 请输入活动名称 trigger blur min 3 max 5 message 长度在 3 到 5 个字符
  • 【PTA】跟奥巴马一起画方块

    美国总统奥巴马不仅呼吁所有人都学习编程 甚至以身作则编写代码 成为美国历史上首位编写计算机代码的总统 2014年底 为庆祝 计算机科学教育周 正式启动 奥巴马编写了很简单的计算机代码 在屏幕上画一个正方形 现在你也跟他一起画吧 输入格式 输
  • 【计算机视觉

    文章目录 一 检测相关 5篇 1 1 Detecting Manufacturing Defects in PCBs via Data Centric Machine Learning on Solder Paste Inspection
  • docker部署nginx时,proxy_pass填localhost报错502

    文章目录 docker部署nginx时 proxy pass填localhost报错502 原因 参考链接 https blog csdn net qq 38623939 article details 129582950 docker部署
  • iar如何生成hex文件

    生成方法如下 1 工具需求 1 iar平台 2 第一种方法 首先在工程选项options里面 选中output converter选项 接着勾中Generate additional output选项 1 然后在Output format
  • nagios发送邮件命令配置

    define command command name notify by email command line usr bin printf b Nagios n nNotification Type NOTIFICATIONTYPE n
  • Bootstrap-table动态新增行,删除行,可编辑

    Bootstrap table动态新增行 删除行 可编辑 效果图 html div class table box style margin 20px div a 添加行 a a 删除行 a div table table div js
  • 区块链技术在网络安全中的应用

    区块链是一个现代的数字分类账本 不仅记录货币交易 还可以记录任何有价值的东西 输入的数字数据在Blockchain上作为相互共享的和永久记录的数据库 利用系统本身去中心化的特性具有明显的优势 区块链数据库不存储在集中位置 这意味着记录确实是
  • 深度学习结合非局部均值滤波的图像去噪算法

    其实这是半年之前完成的内容 一直懒着没有总结 今天看了看代码 发觉再不总结自己以后都看不懂了 故整理如下 非局部均值是一种基于块匹配来确定滤波权值的 即先确定一个块的大小 例如7x7 然后在确定一个搜索区域 例如15x15 在15x15这个