简析ROF降噪原理及python实现

前言:最近在看python计算机视觉,看到了ROF降噪模型,但教程中没有详细解释ROF的原理,所以打算将自己的心得写下来,分享一下,也请大家指出问题,一起学习,因为水平有限,可能会有错误,欢迎指正

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的数学原理,及迭代公式的推导,介绍了梯度下降,在步长的处理上进行了类似于模拟退火的处理方式(使得前期步长较大,后期步长较小),其实还有一种加入“动量因子”的技术,可以使得梯度下降收敛的更快且更容易接近最优点,有兴趣的可以自己搜索一下

由于这是本人第一篇手打的文章,对于一些排版还不是很熟悉,所以上边的代码不能直接复制(手动卖萌)

最后的最后,由于接触计算机视觉时间并不长,希望大家以批判的眼光看待这篇文章,欢迎指正与讨论

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 介绍 先前的教程展示了一个简单的线性模型,对MNIST数据集中手写数字的识别率达到了91%。 在这个教程中,我们会...
    Kimichen7764阅读 1,618评论 0 7
  • 题图来自: github本文主要介绍了PrettyTensor,用来快速构建神经网络。当然,原文写于16年,现在有...
    Kimichen7764阅读 1,680评论 0 1
  • 前言: 以斯坦福cs231n课程的python编程任务为主线,展开对该课程主要内容的理解和部分数学推导。该课程的学...
    Deepool阅读 49,168评论 33 88
  • 10月初纪念我们毕业15周年的同学聚会上,你没有出现——甚至无论我们如何努力,居然得不到关于你的任何消息,连你的联...
    楼心月日记阅读 638评论 0 2
  • 周五晚上,去了白旭的家。一回首,两年未见,没有了很多话题,多了些许生疏。 在我出地铁口的刹那,一抬头看见熟悉的面孔...
    e8e976845a84阅读 238评论 1 1