• 1、高斯噪声
  • 2、均匀分布噪声
  • 3、脉冲噪声(椒盐噪声)
  • 4、Python实现



1、高斯噪声

高斯噪声的概率密度函数

python生成mac python生成脉冲噪声_概率密度


z表示灰度值

μ表示z的平均值或期望值

σ表示z的标准差

σ²表示z的方差高斯噪声的概率密度图像

python生成mac python生成脉冲噪声_python生成mac_02


当z服从上式高斯分布时,其值有70%落在[(μ-σ), (μ+σ)]范围内,有95%落在[(μ-2σ), (μ+2σ)]范围内。

2、均匀分布噪声

均匀分布噪声的概率密度函数

python生成mac python生成脉冲噪声_概率密度_03


概率密度函数的期望值 μ=(a+b)/2

概率密度函数的方差 σ²=(b-a)²/12均匀分布噪声的概率密度图像

python生成mac python生成脉冲噪声_opencv_04

3、脉冲噪声(椒盐噪声)

椒盐噪声的概率密度函数

python生成mac python生成脉冲噪声_概率密度函数_05


椒盐噪声的概率密度图像

python生成mac python生成脉冲噪声_python生成mac_06

  • 如果b>a,灰度值b在图像中将显示为一个亮点,灰度值a在图像中呈现为一个暗点
  • 如果Pa或Pb为零,则脉冲噪声称为单极脉冲
  • 如果Pa=0,则图像中没有暗点,只有亮点噪声,称为盐粒噪声(正脉冲);如果Pb=0,则图像中只有暗点,此时称为胡椒噪声(负脉冲)

4、Python实现

np.clip(a, a_min, a_max, out=None)

作用:将数组a中的所有数限定到范围a_min和a_max中
参数解释
a:输入矩阵
a_min:被限定的最小值,所有比a_min小的数都会强制变为a_min
a_max:被限定的最大值,所有比a_max大的数都会强制变为a_max
out:可以指定输出矩阵的对象,shape与a相同

np.random.normal(loc=0.0, scale=1.0, size=None)

作用:生成高斯分布的概率密度随机数
参数解释
loc:float
此概率分布的均值(对应着整个分布的中心centre)
scale:float
此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)
size:int or tuple of ints
输出的shape,默认为None,只输出一个值

import cv2
import numpy as np
import matplotlib.pyplot as plt
import random

# 高斯噪声
def gaussian_noise(img, miu, sigma):
    """
    img: 原图
    miu: μ
    sigma: σ
    gaussianImg: 噪声处理后的图像
    noise: 噪声图像
    """
    # 将图片灰度标准化
    img = np.array(img/255, dtype=float)
    # 产生高斯噪声图像
    noise = np.random.normal(miu, sigma, img.shape)
    # 将源图像与噪声叠加
    gaussianImg = img + noise
    # 小于0的值设置为0 大于255的值设置为255
    gaussianImg = np.clip(gaussianImg, 0, 1)
    # 将图像灰度范围恢复为0-255
    gaussianImg = np.uint8(gaussianImg * 255)

    return gaussianImg

# 椒盐噪声
def saltAndPepper_noise(img, prob):
    """
    img: 原图像
    prob: 噪声比例
    spImg: 噪声处理后的图像
    """
    spImg = np.zeros(img.shape, np.uint8)
    thres = 1 - prob

    for i in range(img.shape[0]):
        for j in range(img.shape[1]):
            rNum = random.random() # 随机生成0-1之间的数字
            # 如果生成的随机数小于噪声比例则将该像素点添加黑点,即椒噪声
            if rNum < prob:
                spImg[i][j] = 0
            # 如果生成的随机数大于(1-噪声比例)则将该像素点添加白点,即盐噪声
            elif rNum > thres:
                spImg[i][j] = 255
            # 其他情况像素点不变
            else:
                spImg[i][j] = img[i][j]

    return spImg

img = cv2.imread('D:/Study/digital image processing/test/Cameraman.bmp')
res1 = gaussian_noise(img, 0.1, 0.1)
res2 = saltAndPepper_noise(img, 0.06)
plt.subplot(131), plt.imshow(img), plt.title('Input')
plt.xticks([]), plt.yticks([])
plt.subplot(132), plt.imshow(res1), plt.title('gaussianImg')
plt.xticks([]), plt.yticks([])
plt.subplot(133), plt.imshow(res2), plt.title('spImg')
plt.xticks([]), plt.yticks([])
plt.show()

python生成mac python生成脉冲噪声_python_07