如何用python给数据加上高斯噪声

 更新时间:2023年05月06日 10:20:38   作者:迪普达克范特西  
这篇文章主要介绍了如何用python给数据加上高斯噪声问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

python给数据加上高斯噪声

一开始用MATLAB给数据加噪声很简单,就一句话:

% 给数据加指定SNR的高斯噪声
signal_noise = awgn(signal,SNR,'measured');

但用python实现加噪声的时候遇到一个小问题,也是由于本人愚钝的原因吧。

回顾MATLAB中的加高斯噪声

常用方法:

% 给数据加指定SNR的高斯噪声
signal_noise = awgn(signal,SNR,'measured');
Ps=sum(sum((signal-mean(mean(signal))).^2));          %signal power
Pn=sum(sum((signal-signal_noise).^2));                %noise power
snr=10*log10(Ps/Pn);                                %验证所加的噪声

这里的signal 是一个二维的数据矩阵,所以后面的操作都是矩阵的操作。MATLAB中运行完全没有问题。

Python中利用numpy给数据加噪声

本文方法:

# 给数据加指定SNR的高斯噪声
SNR = 5
noise = np.random.randn(signal.shape[0],signal.shape[1])     #产生N(0,1)噪声数据
noise = noise-np.mean(noise)                                 #均值为0
signal_power = np.linalg.norm( signal - signal.mean() )**2 / signal.size    #此处是信号的std**2
noise_variance = signal_power/np.power(10,(SNR/10))         #此处是噪声的std**2
noise = (np.sqrt(noise_variance) / np.std(noise) )*noise    ##此处是噪声的std**2
signal_noise = noise + signal
Ps = ( np.linalg.norm(signal - signal.mean()) )**2          #signal power
Pn = ( np.linalg.norm(signal - signal_noise ) )**2          #noise power
snr = 10*np.log10(Ps/Pn)

有很多人在产生给定SNR的高斯噪声时,用的是:

signal_power = np.linalg.norm( signal )**2
noise_variance = signal_power/np.power(10,(SNR/10))
noise = np.sqrt(noise_variance)*noise + 0

这里实际上是有问题的,我一开始也没发现。因为产生分布为N(mean,std**2)的噪声我们用的公式是:

noise = std * N(0,1) + mean

换句话说,我们需要计算噪声的std 以及 mean 。

计算噪声的 std 时,需要先计算信号的 std,然后利用SNR来求出噪声的 std ,从上面的代码中能发现,signal_power 代表的是信号的std^2 与 signal.size 的乘积,多乘了一个signal.size 那结果肯定是有问题的。

python批量给图形添加噪声

python代码实现批量给图形添加高斯噪声和椒盐噪声

高斯噪声

import cv2
import os
import numpy as np
def add_noise_Guass(img, mean=0, var=0.01):  # 添加高斯噪声
    img = np.array(img / 255, dtype=float)
    noise = np.random.normal(mean, var ** 0.5, img.shape)
    out_img = img + noise
    if out_img.min() < 0:
        low_clip = -1
    else:
        low_clip = 0
        out_img = np.clip(out_img, low_clip, 1.0)
        out_img = np.uint8(out_img * 255)
    return out_img
# 读取函数,用来读取文件夹中的所有函数,输入参数是文件名
def read_directory(directory_name):
    for filename in os.listdir(directory_name):
        print(filename)  # 仅仅是为了测试
        img = cv2.imread(directory_name + "/" + filename)
        #####显示图片#######
        out_img = add_noise_Guass(img)
        cv2.imshow("img", out_img)
        cv2.waitKey(0)
        #####################
        #####保存图片#########
        cv2.imwrite("C:/Users/Dong.Shao2/Desktop/DataSet/gaussian" + "/" + filename, out_img * 255)
read_directory("C:/Users/Dong.Shao2/Desktop/DataSet/image")#这里传入所要读取文件夹的绝对路径,加引号(引号不能省略!)

椒盐噪声

import cv2
import random
import os
import numpy as np
def add_salt_pepper(img, prob):
    resultImg = np.zeros(img.shape, np.uint8)
    thres = 1 - prob
    for i in range(img.shape[0]):
        for j in range(img.shape[1]):
            rdn = random.random()
            if rdn < prob:
                resultImg[i][j] = 0
            elif rdn > thres:
                resultImg[i][j] = 255
            else:
                resultImg[i][j] = img[i][j]
    return resultImg
# 读取函数,用来读取文件夹中的所有函数,输入参数是文件名
def read_directory(directory_name):
    for filename in os.listdir(directory_name):
        print(filename)  # 仅仅是为了测试
        img = cv2.imread(directory_name + "/" + filename)
        #####显示图片#######
        out_img = add_salt_pepper(img,0.05)
        cv2.imshow("img", out_img)
        cv2.waitKey(0)
        #####################
        #####保存图片#########
        cv2.imwrite("C:/Users/Dong.Shao2/Desktop/DataSet/salt_pepper" + "/" + filename, out_img )
read_directory("C:/Users/Dong.Shao2/Desktop/DataSet/image")#这里传入所要读取文件夹的绝对路径,加引号(引号不能省略!)

随机噪声

import cv2
import os
import numpy as np
def random_noise(image,noise_num):
    '''
    添加随机噪点(实际上就是随机在图像上将像素点的灰度值变为255即白色)
    param image: 需要加噪的图片
    param noise_num: 添加的噪音点数目
    return: img_noise
    '''
    # 参数image:,noise_num:
    img_noise = image
    # cv2.imshow("src", img)
    rows, cols, chn = img_noise.shape
    # 加噪声
    for i in range(noise_num):
        x = np.random.randint(0, rows)#随机生成指定范围的整数
        y = np.random.randint(0, cols)
        img_noise[x, y, :] = 255
    return img_noise
# 读取函数,用来读取文件夹中的所有函数,输入参数是文件名
def read_directory(directory_name):
    for filename in os.listdir(directory_name):
        print(filename)  # 仅仅是为了测试
        img = cv2.imread(directory_name + "/" + filename)
        #####显示图片#######
        out_img = random_noise(img,10000)
        cv2.imshow("img", out_img)
        cv2.waitKey(0)
        #####################
        #####保存图片#########
        cv2.imwrite("C:/Users/Dong.Shao2/Desktop/DataSet/random"  + "/" + filename, out_img )
read_directory("C:/Users/Dong.Shao2/Desktop/DataSet/image")#这里传入所要读取文件夹的绝对路径,加引号(引号不能省略!)

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python+Dlib+Opencv实现人脸采集并表情判别功能的代码

    Python+Dlib+Opencv实现人脸采集并表情判别功能的代码

    这篇文章主要介绍了Python+Dlib+Opencv实现人脸采集并表情判别,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Python基于class()实现面向对象原理详解

    Python基于class()实现面向对象原理详解

    这篇文章主要介绍了Python基于class()实现面向对象原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • PyHacker实现网站后台扫描器编写指南

    PyHacker实现网站后台扫描器编写指南

    这篇文章主要为大家介绍了PyHacker实现网站后台扫描器编写指南,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Jupyter Notebook 实现正常显示中文和负号

    Jupyter Notebook 实现正常显示中文和负号

    这篇文章主要介绍了Jupyter Notebook 实现正常显示中文和负号,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Selenium中免登录的实现方法option详解

    Selenium中免登录的实现方法option详解

    在selenium中有很多种可以实现网站的免登录,option就是其中的一种做法,这篇文章主要介绍了Selenium中免登录的实现方法option,需要的朋友可以参考下
    2022-12-12
  • Python pandas 计算每行的增长率与累计增长率

    Python pandas 计算每行的增长率与累计增长率

    这篇文章主要介绍了Python pandas 计算每行的增长率与累计增长率,文章举例详细说明。需要的小伙伴可以参考一下
    2022-03-03
  • python多线程与多进程及其区别详解

    python多线程与多进程及其区别详解

    这篇文章主要介绍了python多线程与多进程及其区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • python可视化 matplotlib画图使用colorbar工具自定义颜色

    python可视化 matplotlib画图使用colorbar工具自定义颜色

    这篇文章主要介绍了python可视化 matplotlib画图使用colorbar工具自定义颜色,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Python ChineseCalendar包主要类和方法详解

    Python ChineseCalendar包主要类和方法详解

    ChineseCalendar 是一个 Python 包,用于获取中国传统日历信息。这个包提供了中国农历、二十四节气、传统节日、黄历等信息,这篇文章主要介绍了Python ChineseCalendar包简介,需要的朋友可以参考下
    2023-03-03
  • opencv 分类白天与夜景视频的方法

    opencv 分类白天与夜景视频的方法

    最近有个数据需要分类处理,是一批含有白天跟夜晚的视频数据,需要进行区分开来,本文就来实现,感兴趣的可以了解一下
    2021-06-06

最新评论