基本的图像处理和操作——图像去噪

图像去噪

 图像去噪是在去除图像噪声的同时,尽可能地保留图像细节和结构的处理技术。我们这里使用 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:\windows\fonts\SimSun.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 去噪后的图像保留了边缘和图像的结构信息,同时模糊了“噪声”。

  • 14
    点赞
  • 126
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值