图像去噪
图像去噪是指在去除图像噪声的同时,尽可能保留图像的细节和结构
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去噪——