Python3+OpenCV(十):噪声模型



1、高斯噪声

高斯噪声的概率密度函数
在这里插入图片描述
z表示灰度值
μ表示z的平均值或期望值
σ表示z的标准差
σ²表示z的方差

高斯噪声的概率密度图像
在这里插入图片描述
当z服从上式高斯分布时,其值有70%落在[(μ-σ), (μ+σ)]范围内,有95%落在[(μ-2σ), (μ+2σ)]范围内。

2、均匀分布噪声

均匀分布噪声的概率密度函数
在这里插入图片描述
概率密度函数的期望值 μ=(a+b)/2
概率密度函数的方差 σ²=(b-a)²/12

均匀分布噪声的概率密度图像
在这里插入图片描述

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

椒盐噪声的概率密度函数
在这里插入图片描述
椒盐噪声的概率密度图像
在这里插入图片描述

  • 如果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()

在这里插入图片描述

参考博客
https://blog.csdn.net/qq_38395705/article/details/106311905

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值