⼏种常见的数字图像噪声,及使⽤python添加噪声
常见噪声:⾼斯噪声,椒盐噪声,泊松噪声,乘性噪声
⾼斯噪声
概率密度函数服从⾼斯分布的噪声。
产⽣原因:
1)图像传感器在拍摄时市场不够明亮、亮度不够均匀;
2)电路各元器件⾃⾝噪声和相互影响;
3)图像传感器长期⼯作,温度过⾼
泊松噪声
泊松噪声,就是符合泊松分布的噪声模型,泊松分布适合于描述单位时间内随机事件发⽣的次数的概率分布。如某⼀服务设施在⼀定时间内受到的服务请求的次数,电话交换机接到呼叫的次数、汽车站台的候客⼈数、机器出现的故障数、⾃然灾害发⽣的次数、DNA序列的变异数、放射性原⼦核的衰变数等等
乘性噪声
乘性噪声⼀般由信道不理想引起,它们与信号的关系是相乘,信号在它在,信号不在他也就不在。
椒盐噪声
椒盐噪声,椒盐噪声⼜称脉冲噪声,它随机改变⼀些像素值,是由图像传感器,传输信道,解码处理等产⽣的⿊⽩相间的亮暗点噪声。
椒盐噪声往往由图像切割引起。
瑞利噪声
瑞利噪声相⽐⾼斯噪声⽽⾔,其形状向右歪斜,这对于拟合某些歪斜直⽅图噪声很有⽤。
瑞利噪声的实现可以借由平均噪声来实现。其matlab实现如下:
a = -0.2;
b = 0.03;
n_rayleigh = a + (-b .* log(1 - rand(M,N))).^0.5;
伽马噪声
伽马噪声的分布,服从了伽马曲线的分布。伽马噪声的实现,需要使⽤b个服从指数分布的噪声叠加⽽来。指数分布的噪声,可以使⽤均匀分布来实现。(b=1时为指数噪声,b>1时通过若⼲个指数噪声叠加,得到伽马噪声)
a = 25;
b = 3;
n_Erlang = zeros(M,N);
for j=1:b
n_Erlang = n_Erlang + (-1/a)*log(1 - rand(M,N));
end
均匀噪声
使⽤python的skimage.util.random_noise(image, mode=‘gaussian’, seed=None,
clip=True, **kwargs)来添加噪声
1.先安装必要的依赖库:numpy , scipy , matpoltlib
2.安装scikit-image
pip install scikit-image
random python3.导⼊util库
import skimage
from skimage import util
4.函数介绍
def random_noise(image, mode='gaussian', seed=None, clip=True,**kwargs):
功能:为浮点型图⽚添加各种随机噪声
参数:
image:输⼊图⽚(将会被转换成浮点型),ndarray型
mode:可选择,str型,表⽰要添加的噪声类型
gaussian:⾼斯噪声
localvar:⾼斯分布的加性噪声,在“图像”的每个点处具有指定的局部⽅差。
poisson:泊松再⽣
salt:盐噪声,随机将像素值变成1
pepper:椒噪声,随机将像素值变成0或-1,取决于矩阵的值是否带符号
s&p:椒盐噪声
speckle:均匀噪声(均值mean⽅差variance),out=image+n*image
seed:可选的,int型,如果选择的话,在⽣成噪声前会先设置随机种⼦以避免伪随机
clip:可选的,bool型,如果是True,在添加均值,泊松以及⾼斯噪声后,会将图⽚的数据裁剪到合适
范围内。如果谁False,则输出矩阵的值可能会超出[-1,1] mean:可选的,float型,⾼斯噪声和均值噪声中的mean参数,默认值=0
var:可选的,float型,⾼斯噪声和均值噪声中的⽅差,默认值=0.01(注:不是标准差)
local_vars:可选的,ndarry型,⽤于定义每个像素点的局部⽅差,在localvar中使⽤
amount:可选的,float型,是椒盐噪声所占⽐例,默认值=0.05
salt_vs_pepper:可选的,float型,椒盐噪声中椒盐⽐例,值越⼤表⽰盐噪声越多,默认值=0.5,即椒盐等量
--------
返回值:ndarry型,且值在[0,1]或者[-1,1]之间,取决于是否是有符号数
-------
注意:略(见源码)
python中的**kwargs是什么?
def test_var_args(f_arg,*argv):
print("first normal arg:", f_arg)
for arg in argv:
print("another arg through *argv:", arg)
test_var_args('yasoob','python','eggs','test')
输出如下
first normal arg: yasoob
another arg through *argv: python
another arg through *argv: eggs
another arg through *argv: test
这说明后边的多个参数会被放进⼀个名为argv的列表中,⽽函数内部通过这个列表使⽤这些参数
**kwargs允许将⼀个不定长度的键值对,作为参数传递给函数,如果需要在⼀个函数中处理带名字的参数,就需要⽤到kwargs(意思就是kwarg代表很多有名字的参数),例如
def test_args_kwargs(arg1, arg2, arg3):
print("arg1:", arg1)
print("arg2:", arg2)
print("arg3:", arg3)
分别使⽤*args和**kwargs来给函数传递参数
>>> args =("two",3,5)
>>> test_args_kwargs(*args)
arg1: two
arg2:3
arg3:5
>>> kwargs ={"arg3":3,"arg2":"two","arg1":5}
>>> test_args_kwargs(**kwargs)
arg1:5
arg2: two
arg3:3
注意到,kwargs传递必须是键值对传递,⽽args只需要顺序传递进去即可
⼀个批量添加噪声的python代码
import cv2
import os
import numpy as np
from PIL import Image
from skimage import util
#批处理
path='F:/0.MaskRCNN(3 times)/hook_data/Mask/test3'#图⽚⽂件夹路径
image_names=os.listdir(path)#列举path下所有⽂件和⽂件夹名称(返回⼀个list)
save_dir=os.path.join(path,'speckle(0,0.1)_test03')#我的⽂件夹名称
os.mkdir(save_dir)
for image_name in image_names:
if(dswith('.jpg')):
img=Image.open(os.path.join(path,image_name))
img=np.array(img)
noise_gs_img=util.random_noise(img,mode='speckle')
noise_gs_img=noise_gs_img*255#由于输出是[0,1]的浮点型,先转成灰度图(我的输⼊就是灰度图) noise_gs_img=noise_gs_img.astype(np.int)#再变成整型数组
cv2.imwrite(os.path.join(save_dir,image_name),noise_gs_img)#保存到新建的⽂件夹
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论