您的位置:首页 > 理论基础

阿齐兹的PyCV学习笔记——图像去噪

2018-03-03 17:06 267 查看

图像去噪

图像去噪是指在去除图像噪声的同时,尽可能保留图像的细节和结构

ROF(Rudin-Osher-Fatemi)去噪模型:该模型使去噪后的图像像素值“平坦”变化,但在图像区域边缘像素值“跳跃”变化,使处理后的图像更平滑,同时保持图像边缘和结构信息

#coding:utf-8
from numpy import *

def denoise(im, U_init, tolerance=0.1, tau=0.125, tv_weight=100):
"""使用A.Chambolle公式实现ROF去噪模型
输入:含有噪声的输入图像(灰度图像)、U的初始值、TV正则项权值、步长、停业条件
输出:去噪和去除纹理后的图像、纹理残留"""

m,n = im.shape #噪声图像的大小

#初始化
U = U_init
Px = im #对偶域的x分量
Py = im #对偶域的y分量
error = 1

while(error > tolerance):
Uold = U

#原始变量的梯度
GradUx = roll(U,-1,axis=1)-U #变量U梯度的x分量
GradUy = roll(U,-1,axis=0)-U #变量U梯度的y分量

#更新对偶变量
PxNew = Px + (tau/tv_weight)*GradUx
PyNew = Py + (tau/tv_weight)*GradUy
NormNew = maximum(1,sqrt(PxNew**2+PyNew**2))

Px = PxNew/NormNew #更新x变量
Py = PyNew/NormNew #更新y变量

#更新原始变量
RxPx = roll(Px,1,axis=1) #对x分量进行向右x轴平移
RyPy = roll(Py,1,axis=0) #对y分量进行向右y轴平移

DivP = (Px-RxPx)+(Py-RyPy) #对偶域的散度
U = im + tv_weight*DivP #更新原始变量

#更新误差
error = linalg.norm(U-Uold)/sqrt(n*m)

return U,im-U #去噪后的图像和纹理残余


roll()方法可以在一个坐标轴上循环“滚动”数组中的元素值,计算领域元素的差异

linalg.norm()方法可以衡量两个数组之间的差异

实例一:

from numpy import *
from numpy import random
from scipy.ndimage import filters
import rof

#使用噪声创建合成图像
im = zeros((500,500))
im[100:400,100:400] = 128
im[200:300,200:300] = 255
im = im + 30*random.standard_normal((500,500))

U,T = rof.denoise(im,im)
G = filters.gaussian_filter(im,10)

#保存生成结果
from scipy.misc import imsave
imsave('synth_rof.pdf',U)
imsave('synth_gaussian.pdf',G)


效果图:



实例二:

from PIL import Image
from pylab import *
import rof

im = array(Image.open('C:/Users/0AQZ0/Documents/exercisecode/Python/PyCV/Images/001.jpg').convert('L'))
U,T = rof.denoise(im,im)

figure()
gray()
imshow(U)
axis('equal')
axis('off')
show()


效果图:

高斯模糊——



ROF去噪——

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息