给图像添加椒盐噪声和高斯噪声 python实现

一. 椒盐噪声

        在噪声的概念中,通常采用信噪比(Signal-Noise Rate, SNR)衡量图像噪声。通俗的讲就是信号占多少,噪声占多少,SNR越小,噪声占比越大。

        在信号系统中,计量单位为dB,为10lg(PS/PN), PS和PN分别代表信号和噪声的有效功率。在这里,采用信号像素点的占比充当SNR,以衡量所添加噪声的多少。

        椒盐噪声又称为脉冲噪声,它是一种随机出现的白点(盐噪声)或者黑点(椒噪声)。

        高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。


椒盐噪声污染后的图像 ↑

高斯噪声污染后的图像 ↑

原图 ↑

二. python实现给图像添加椒盐噪声和高斯噪声

import numpy as np

import random

import cv2

from matplotlib import pyplot as plt

def sp_noise(image,prob):

    '''

    添加椒盐噪声

    prob:噪声比例

    '''

    output = np.zeros(image.shape,np.uint8)

    thres = 1 - prob

    for i in range(image.shape[0]):

        for j in range(image.shape[1]):

            rdn = random.random()

            if rdn < prob:

                output[i][j] = 0

            elif rdn > thres:

                output[i][j] = 255

            else:

                output[i][j] = image[i][j]

    return output

def gasuss_noise(image, mean=0, var=0.001):

    '''

        添加高斯噪声

        mean : 均值

        var : 方差

    '''

    image = np.array(image/255, dtype=float)

    noise = np.random.normal(mean, var ** 0.5, image.shape)

    out = image + noise

    if out.min() < 0:

        low_clip = -1.

    else:

        low_clip = 0.

    out = np.clip(out, low_clip, 1.0)

    out = np.uint8(out*255)

    #cv.imshow("gasuss", out)

    return out

# Read image

img = cv2.imread("../paojie.jpg")

# 添加椒盐噪声,噪声比例为 0.02

out1 = sp_noise(img, prob=0.02)

# 添加高斯噪声,均值为0,方差为0.001

out2 = gasuss_noise(img, mean=0, var=0.001)

# 显示图像

plt.figure(1)

plt.subplot(131)

plt.axis('off')  # 关闭坐标轴

plt.title('Original')

plt.imshow(img)

plt.subplot(132)

plt.axis('off')

plt.title('Add Salt and Pepper noise')

plt.imshow(out1)

plt.subplot(133)

plt.axis('off')

plt.title('Add Gaussian noise')

plt.imshow(out2)

plt.show()

三. 实验结果

 

四. 参考内容

https://www.jianshu.com/p/0ac8f1d658e3

原文地址:https://www.cnblogs.com/wojianxin/p/12499928.html