我是靠谱客的博主 欢喜小土豆,最近开发中收集的这篇文章主要介绍基本的图像处理和操作——图像去噪图像去噪,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

图像去噪

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

最后

以上就是欢喜小土豆为你收集整理的基本的图像处理和操作——图像去噪图像去噪的全部内容,希望文章能够帮你解决基本的图像处理和操作——图像去噪图像去噪所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部