简析ROF降噪原理及python实现详解
1.ROF简介
ROF模型在92年由Rudin,Osher,Fatemi提出,他们提出“ 最小化 ‘全变差’ ” 可以有更好的去除图像中噪声的效果。
2.ROF降噪原理
1.规定一些符号
2.什么是全变差
这里介绍了什么是全变差
在原论文中,全变差是图像差分的L1范数,即
3.将问题转化为数学问题
这里保证求出的图像与原图像在整体灰度上相等(即假定n(x,y)的均值为0)
原论文中还有如下约束,
n(x,y)的标准差为σ²,但是在实际问题中无法提前得知σ的值
将问题描述为,在上式的约束下,使TV(U)最小。
作者在论文中用到了欧拉-拉格朗日方程,由于我目前还没有学过泛函数分析,所以采用了梯度下降法(Gradient Descent)
下面先解释一下什么是梯度下降法:
迭代公式为:
step为步长,决定了每次移动的距离
图画的很丑,大家可以自己画一画,理解一下
如果我们想求最大值,只需将迭代公式中的减号变为加号
对梯度下降法比较直观的解释是:想象你站在一座山的山腰处,你想要最快的下山,一种方法就是沿着坡度最大的方向走(如果实在太陡了,走不了,那你就飞吧。。。),通过这个例子,我们能发现一个问题,那就是梯度下降法可能陷入局部最优(陷入某一个山谷中),但作者在论文中提到,这种局部最优更接近于图像的处理过程(可以理解为这种局部最优是距离噪声图像最近的一个最优解,如果全局最优的话,可能会丧失掉太多的图像信息)
4.如何求(迭代)出清晰图像
首先,我们要先定义一个函数,这个函数能将优化问题和约束条件结合起来,我们称这个函数为损失函数
我们要让这个损失函数最小,就能保证生成图像和含噪声的图像之间相差不多,并且让全变差也比较小
通过上边的讲解,我们知道只要求出Loss(U)对于U的导数(更准确地说,应是差分,因为图像不是连续的函数),就能通过梯度下降法,迭 代出清晰图像!
3.代码实现
# -*- coding: utf-8 -*-
"""
Created on Tue Oct 17 21:33:43 2017
@author: ningminghao
"""
from numpy import *
from pylab import *
from PIL import Image
def denoise(im,U_init,tau=0.5,tv_weight=30,max_iteration=10):
#im,U_init为含噪音的图像,tau与步长有关,tv_weight为全变差所占的权重λ,max_iteration为最大的迭代次数
m,n = im.shape
U = U_init
Px = im
Py = im
count = 0
while(count<max_iteration):
Uold = U
GradUx = roll(U,-1,axis=1)-U #这里就是差分ux,如果对axis的选取有疑惑,本文后边提供了一个链接
GradUy = roll(U,1,axis = 0)-U #这里就是差分uy
#roll()函数,其实就相当于将矩阵移动,类似于无界模式的贪吃蛇,在最边缘位置的数会移动到对面
NormNew = maximum(1,sqrt(GradUx**2+GradUy**2))#为了防止出现分母为0
Px = GradUx/NormNew
Py = GradUy/NormNew
RxPx = roll(Px,-1,axis=1)
RyPy = roll(Py,-1,axis=0)
DivP = (RxPx-Px)+(RyPy-Py)
step = tau*(exp(-count*2/(max_iteration))+0.1)#有点模拟退火的意思
U = Uold - step*((Uold-im)+tv_weight*DivP) #梯度下降
error = linalg.norm(U-Uold)/sqrt(n*m)
if (count%10==0):
print('step:',step)
print('error:',error)
count+=1
return U,U-U_init
from numpy import random
from scipy.ndimage import filters
im = zeros((500,500)) #建立一个图形,外黑,中灰,内白
im[100:400,100:400] = 128
im[200:300,200:300] = 255
noise = 30 *random.standard_normal((500,500)) #噪声
im = im + noise
U,T = denoise(im,im,max_iteration=10,tau=0.5)
gray()
subplot(121)
imshow(im)
subplot(122)
imshow(U)
print(corrcoef(T.flatten(),noise.flatten()))#相关度检验
左为模糊之后的图像,右为ROF处理后的图像
以上代码完全按照上面的公式推导来的,如果哪里不懂就再看看公式推导
建议手动敲一下上面的代码,相信你会更好的理解
对python的axis有疑惑的点这里
4.总结一下
简单的介绍了ROF的数学原理,及迭代公式的推导,介绍了梯度下降,在步长的处理上进行了类似于模拟退火的处理方式(使得前期步长较大,后期步长较小),其实还有一种加入“动量因子”的技术,可以使得梯度下降收敛的更快且更容易接近最优点,有兴趣的可以自己搜索一下
参考链接:https://www.jianshu.com/p/070ebf691042
简析ROF降噪原理及python实现详解相关推荐
- Apriori 算法原理以及python实现详解
Apriori 算法原理以及python实现 Apriori算法是第一个关联规则挖掘算法,也是最经典的算法.它利用逐层搜索的迭代方法找出数据库中项集的关系,以形成规则,其过程由连接(类矩阵运算)与 ...
- python创建双链表_Python双链表原理与实现方法详解
本文实例讲述了Python双链表原理与实现方法.分享给大家供大家参考,具体如下: Python实现双链表 文章目录 Python实现双链表 单链表与双链表比较 双链表的实现 定义链表节点 初始化双链表 ...
- 基于模糊C均值聚类(FCM)的图像分割原理+python代码详解
一.模糊 "模糊":一个元素可以不同程度的属于某几个子集,也就是说元素对于集合的隶属度可以在[0,1]上取连续值. 二.步骤 2.1步骤 翻译一下: S1:初始化参数:加权指数m, ...
- mysql 账户管理_Mysql账户管理原理与实现方法详解
本文实例讲述了Mysql账户管理原理与实现方法.分享给大家供大家参考,具体如下: 账户管理 在生产环境下操作数据库时,绝对不可以使用root账户连接,而是创建特定的账户,授予这个账户特定的操作权限,然 ...
- 07 Python数据类型详解
文章目录 一.整数类型(int)详解 1.1 整数的不同进制 1) 十进制形式 2) 二进制形式 3) 八进制形式 4) 十六进制形式 1.2 数字分隔符 1.3 相关方法 二.字符串类型(strin ...
- Python 异常处理 详解
Python 异常处理 详解 1.错误和异常 1.1 错误 `Error` 1.2 异常 `Exception` 1.3 总结 2.产生异常 3.捕获异常 3.1 语法 3.2 示例 1 3.3 示例 ...
- Python|SQL详解之DDL|DML|DQL|DCL|索引|视图、函数和过程|JSON类型|窗口函数|接入MySQL|清屏|正则表达式|executemany|语言基础50课:学习(14)
文章目录 系列目录 原项目地址 第41课:SQL详解之DDL 建库建表 删除表和修改表 第42课:SQL详解之DML insert操作 delete 操作 update 操作 完整的数据 第43课:S ...
- Nginx 反向代理工作原理简介与配置详解
Nginx 反向代理工作原理简介与配置详解 测试环境 CentOS 6.8-x86_64 nginx-1.10.0 下载地址:http://nginx.org/en/download.html 安装 ...
- java同步方法完成案例_Java同步代码块和同步方法原理与应用案例详解
本文实例讲述了java同步代码块和同步方法.分享给大家供大家参考,具体如下: 一 点睛 所谓原子性WOmoad:一段代码要么执行,要么不执行,不存在执行一部分被中断的情况.言外之意是这段代码就像原子一 ...
最新文章
- 2021/6/18~19 每天学习python 30分钟 -了解python - python的基本变量概述
- Spring 是解析配置类过程详解
- v系列存储配置Linux多路径,linux下san存储多路径软件的配置
- (十)Java B2B2C o2o多用户商城 springcloud架构- SSO单点登录之OAuth2.0登录认证(1)
- h3c s7506e 配置手册_H3C交换机s5500Web登录配置
- 服务器系统装软路由,服务器系统设置软路由
- Linux debian设置主机不休眠教程
- 图片热点的使用,html area 的用法
- MySQl Search JSON Values
- AR增强现实的未来展望
- Java入门教程:Java初学者容易犯的错误
- phpstudy mysql 1067_MySQL_MySQL的1067错误解决,1 
安装MYSQL后更改了ROOT的密码 - phpStudy...
- 基金登记过户系统相关
- 全国计算机二级考试vb考点,计算机二级考试VB考点:通用对话框控件
- 计算机中的打印机,如何添加打印机,教您电脑如何添加打印机
- SpringBoot 整合ActiveMQ
- html图片滤色,css--图片处理
- Git 核心概念:工作区与暂缓区(添加提交及查看状态充分体现)
- 数学符号对应的英文读音
- 申请TexturePacker序列号
热门文章
- 智能汽车业务断崖式下滑,虹软科技“腾挪”前后装
- 12.12 极值问题
- 【27】SIMD:如何加速矩阵乘法?
- android反射替换字体,快速使用反射更换Android全局字体
- Quartus ii和Modelsim SE联合仿真的问题总结
- 一键部署网站php源码,如何轻松建站?站点一键部署搭建(详细教程)
- php有赞sdk,youzan-sdk/README.md at master · imhui/youzan-sdk · GitHub
- 简单的文具店库存管理系统
- C - Censor SCU - 4438
- 高级项目经理推荐:19个超实用的自学网站