高斯噪声
图像噪声之高斯噪声(gauss noise)
概述:
高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声
与椒盐噪声相似(Salt And Pepper Noise),高斯噪声(gauss noise)也是数字图像的一个常见噪声。
椒盐噪声是出现在随机位置、噪点深度基本固定的噪声,高斯噪声与其相反,是几乎每个点上都出现噪声、噪点深度随机的噪声。
算法步骤:
通过概率论里关于正态分布的有关知识可以很简单的得到其计算方法,高斯噪声的概率密度服从高斯分布(正态分布)其中有means(平均值)和sigma(标准方差)两个参数。
高斯分布(正态分布):
对于每个输入像素,我们可以通过与符合高斯分布的随机数相加, 得到输出像素:
Pout = Pin + F(means,sigma)
获得一个符合高斯分布的随机数有好几种方法,比如最基本的一个方法是使用标准的正态累积分布函数的反函数。除此之外还有其他更加高效的方法,Box-Muller变换就是其中之一。另一个更加快捷的方法是ziggurat算法。
而python的random库也提供了产生高斯随机数的方法:
高斯分布
random.gauss(mu, sigma)
Gaussian distribution. mu is the mean, and sigma is the standard deviation. This is slightly faster than the normalvariate() function defined below.
给一副数字图像加上高斯噪声的处理顺序如下:
- a.设定参数sigma 和 Xmean
- b.产生一个高斯随机数
- c.根据输入像素计算出输出像素
- d.重新将像素值限制或放缩在[0 ~ 255]之间
- e.循环所有像素
- f.输出图像。
编程实例:
# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
from numpy import*
import random
#读取图片并转为数组
im = array(Image.open('./source/test.jpg'))
#设定高斯函数的偏移
means = 0
#设定高斯函数的标准差
sigma = 25
#r通道
r = im[:,:,0].flatten()
#g通道
g = im[:,:,1].flatten()
#b通道
b = im[:,:,2].flatten()
#计算新的像素值
for i in range(im.shape[0]*im.shape[1]):
pr = int(r[i]) + random.gauss(0,sigma)
pg = int(g[i]) + random.gauss(0,sigma)
pb = int(b[i]) + random.gauss(0,sigma)
if(pr < 0):
pr = 0
if(pr > 255):
pr = 255
if(pg < 0):
pg = 0
if(pg > 255):
pg = 255
if(pb < 0):
pb = 0
if(pb > 255):
pb = 255
r[i] = pr
g[i] = pg
b[i] = pb
im[:,:,0] = r.reshape([im.shape[0],im.shape[1]])
im[:,:,1] = g.reshape([im.shape[0],im.shape[1]])
im[:,:,2] = b.reshape([im.shape[0],im.shape[1]])
#显示图像
imshow(im)
show()
这里由于默认图像会被编码成无符号八位整数(unit8),所以当进行数值计算时,如果出现大于255和小于0的情况会进行滚动,比如255 + 10 = 9 ,如果不进行处理,结果是错误的,所以必须转成int计算,限制范围后再赋值回去,下面是直接运算造成的错误结果(sigma = 25):
# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
from numpy import*
import random
#读取图片并转为数组
im = array(Image.open('./source/test.jpg'))
#设定高斯函数的偏移
means = 0
#设定高斯函数的标准差
sigma = 25
#r通道
r = im[:,:,0].flatten()
#g通道
g = im[:,:,1].flatten()
#b通道
b = im[:,:,2].flatten()
#计算新的像素值
for i in range(im.shape[0]*im.shape[1]):
r[i] = r[i] + random.gauss(0,sigma)
g[i] = g[i] + random.gauss(0,sigma)
b[i] = b[i] + random.gauss(0,sigma)
im[:,:,0] = r.reshape([im.shape[0],im.shape[1]])
im[:,:,1] = g.reshape([im.shape[0],im.shape[1]])
im[:,:,2] = b.reshape([im.shape[0],im.shape[1]])
#显示图像
imshow(im)
show()
运行结果:
原图
sigma = 15
sigma = 25
sigma = 40
结语:
本篇博客主要介绍了高斯噪声这种常见的图像噪声的原理与生成,希望对大家有所帮助~
时间: 2024-10-02 17:53:16