matlab版本的有非常nb的库函数,很适合工程开发
pyhton版本的适合学习基础理论知识
使用python产生加性零均值高斯噪声:是对每一个点的灰度值加上一个随机数,使用Box-Muller算法,该算法用均匀分布生成的两组独立的随机数通过以下公式生成正态分布随机变量X、Y,具体公式如下:
Box-Muller 是产生随机数的一种方法。Box-Muller 算法隐含的原理非常深奥,但结果却是相当简单。它一般是要得到服从正态分布的随机数,基本思想是先得到服从均匀分布的随机数再将服从均匀分布的随机数转变为服从正态分布。
# -*- coding: utf-8 -*-
# 加性零均值高斯噪声
import cv2
import numpy as np
fn = "64.png"
img_1 = cv2.imread(fn)
img = cv2.cvtColor(img_1, cv2.COLOR_BGR2GRAY)
param = 20
# 灰阶范围
grayscale = 256
w = img.shape[1]
h = img.shape[0]
newimg = np.zeros((h, w), np.uint8)
for x in range(0, h):
for y in range(0, w, 2):
r1 = np.random.random_sample()
r2 = np.random.random_sample()
z1 = param * np.cos(2 * np.pi * r2) * np.sqrt((-2) * np.log(r1))
z2 = param * np.sin(2 * np.pi * r2) * np.sqrt((-2) * np.log(r1))
fxy = int(img[x, y] + z1)#img像素点的值
fxy1 = int(img[x, y + 1] + z2)
# f(x,y)
if fxy < 0:
fxy_val = 0
elif fxy > grayscale - 1:
fxy_val = grayscale - 1
else:
fxy_val = fxy
# f(x,y+1)
if fxy1 < 0:
fxy1_val = 0
elif fxy1 > grayscale - 1:
fxy1_val = grayscale - 1
else:
fxy1_val = fxy1
newimg[x, y] = fxy_val
newimg[x, y + 1] = fxy1_val
cv2.imshow('preview', newimg)
cv2.imwrite("F:\\projec_tt\\create_noise\\pic_2\\test2.png",newimg)
cv2.waitKey()
效果图涉及军工机密,这里就不放了!
信噪比
在噪声的概念中,通常采用信噪比(Signal-Noise Rate, SNR)衡量图像噪声。通俗的讲就是信号占多少,噪声占多少,SNR越小,噪声占比越大。
在信号系统中,计量单位为dB,为10lg(PS/PN), PS和PN分别代表信号和噪声的有效功率。
在这里,采用信号像素点的占比充当SNR,以衡量所添加噪声的多少。
举个例,假设一张图像的宽x高 = 10x10 ,共计100个像素,想让其中20个像素点变为噪声,其余80个像素点保留原值,则这里定义的SNR=80/100 = 0.8 。
椒盐噪声又称为脉冲噪声,它是一种随机出现的白点或者黑点,如下图。
1. 椒盐噪声(Salt And Pepper Noise)
椒盐噪声是一种因为信号脉冲强度引起的噪声,信噪比(Signal NoiseRate)是衡量图像噪声的一个数字指标。
给一副数字图像加上椒盐噪声的处理顺序应该如下:
1.指定信噪比 SNR 其取值范围在[0, 1]之间
2.计算总像素数目 SP, 得到要加噪的像素数目 NP = SP * (1-SNR)
3.随机获取要加噪的每个像素位置P(i, j)
4.指定像素值为255或者0。
5.重复c, d两个步骤完成所有像素的NP个像素
2. 高斯噪声(Gaussian Noise)
高斯噪声的密度取决于公式G(x, sigma) 其中X是代表平均值,sigma代表的标准方差,每个输入像素 Pin,
一个正常的高斯采样分布公式G(d), 得到输出像素Pout.
Pout = Pin + XMeans + sigma *G(d)
其中d为一个线性的随机数,G(d)是随机数的高斯分布随机值。
给一副数字图像加上高斯噪声的处理顺序如下:
a. 输入参数sigam 和 X mean
b. 以系统时间为种子产生一个伪随机数
c. 将伪随机数带入G(d)得到高斯随机数
d. 根据输入像素计算出输出像素
e. 重新将像素值防缩在[0 ~ 255]之间
f. 循环所有像素
g. 输出图像
import cv2
import numpy as np
def saltpepper(img,n):
m=int((img.shape[0]*img.shape[1])*n)
for a in range(m):
i=int(np.random.random()*img.shape[1])
j=int(np.random.random()*img.shape[0])
if img.ndim==2:
img[j,i]=255
elif img.ndim==3:
img[j,i,0]=255
img[j,i,1]=255
img[j,i,2]=255
for b in range(m):
i=int(np.random.random()*img.shape[1])
j=int(np.random.random()*img.shape[0])
if img.ndim==2:
img[j,i]=0
elif img.ndim==3:
img[j,i,0]=0
img[j,i,1]=0
img[j,i,2]=0
return img
img=cv2.imread('F:\\projec_tt\\create_noise\\pic_3\\64.png')
saltImage=saltpepper(img,0.01)
cv2.imshow('F:\projec_tt\create_noise\pic_3\saltImage',saltImage)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出加噪以后的图像
致谢 :
https://blog.csdn.net/myhaspl/article/details/37693429?utm_source=tuicool&utm_medium=referral