简析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

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bonefire20

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值