概述
图像去噪
图像去噪是在去除图像噪声的同时,尽可能地保留图像细节和结构的处理技术。我们这里使用 ROF(Rudin-Osher-Fatemi)去噪模型。图像去噪对于很多应用来说都非常重要;这些应用范围很广,小到让你的假期照片看起来更漂亮,大到提高卫星图像的质量。ROF 模型具有很好的性质:使处理后的图像更平滑,同时保持图像边缘和结构信息。
ROF模型
rof.py
from numpy import *
def denoise(im,U_init,tolerance=0.1,tau=0.125,tv_weight=100):
"""使用A. Chambolle(2005)在公式(11)中的计算步骤实现Rudin-Osher-Fatemi(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() 函数,该函数可以衡量两个数组间(这个例子中是指图像矩阵 U 和 Uold)的差异。我们将这个 denoise() 函数保存到 rof.py 文件中。
下面使用一个合成的噪声图像示例来说明如何使用该函数:
from PIL import Image
import numpy as np
from pylab import *
from numpy import *
from numpy import random
from scipy.ndimage import filters
import rof
#添加中文字体
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:windowsfontsSimSun.ttc", size=14)
figure()
gray()
#使用噪声创建合成图像
im = zeros((500,500))
im[100:400,100:400] = 128
im[200:300,200:300] = 255
im = im + 30*random.standard_normal((500,500))
subplot(1,3,1)
imshow(im)
axis("off")
title(u'原图', FontProperties=font)
U,T = rof.denoise(im,im)
G = filters.gaussian_filter(im,10)
subplot(1,3,2)
imshow(U)
axis("off")
title(u'rof去噪图像', FontProperties=font)
subplot(1,3,3)
imshow(G)
axis("off")
title(u'高斯去噪图像', FontProperties=font)
show()
#保存生成结果
#from imageio import imsave
#imsave('synth_rof.pdf',U)
#imsave('synth_gaussian.pdf',G)
imsave在新版scipy模块中被删去,因此使用imshow()函数代替显示。
下面看一下在实际图像中使用 ROF 模型去噪的效果:
from PIL import Image
from pylab import *
import rof
from scipy.ndimage import filters
figure()
gray()
im = array(Image.open('empire.jpg').convert('L'))
subplot(1,3,1)
imshow(im)
axis("off")
U,T = rof.denoise(im,im)
G = filters.gaussian_filter(im,10)
subplot(1,3,2)
imshow(U)
axis("off")
subplot(1,3,3)
imshow(G)
axis("off")
show()
为了方便比较,该图中同样显示了模糊后的图像。可以看到,ROF 去噪后的图像保留了边缘和图像的结构信息,同时模糊了“噪声”。
最后
以上就是欢喜小土豆为你收集整理的基本的图像处理和操作——图像去噪图像去噪的全部内容,希望文章能够帮你解决基本的图像处理和操作——图像去噪图像去噪所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复