如何用python给数据加上高斯噪声
作者:迪普达克范特西 发布时间:2023-06-13 18:18:04
标签: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")#这里传入所要读取文件夹的绝对路径,加引号(引号不能省略!)
来源:https://blog.csdn.net/sinat_24259567/article/details/93889547


猜你喜欢
- 本文主要介绍Python3.6及TensorFlow的安装和配置流程。一、Python官网下载自己电脑和系统对应的Python安装包。网址:
- 字符串格式化输出是python非常重要的基础语法,今天就把三种格式化输出做一个简单的总结,希望对大家有帮助。格式化输出:内容按照一定格式要求
- 本文讲述了Python多进程同步简单实现代码。分享给大家供大家参考,具体如下:#encoding=utf8from multiprocess
- 前言ThinkPHP,是为了简化企业级应用开发和敏捷WEB应用开发而诞生的开源轻量级PHP框架。随着框架代码量的增加,一些潜在的威胁也逐渐暴
- 第一步,建立一个CPP的DLL工程,然后写如下代码,生成DLL#include <stdio.h> &nb
- $tar xvf go1.3.3.linux-amd64.tar.gz$mv go /usr/local/$vim /etc/profile
- 本文帮你六步改善SQL Server安全规划全攻略。一、什么是SQL注入式攻击所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的
- 如下所示:var table_name = table.render({});page_size = table_name.config.l
- 一、PIL库对图像的基本操作1、读取图片PIL网上有很多介绍,这里不再讲解。直接操作,读取一张图片,将其转换为灰度图像,并打印出来。from
- 形参可以设置参数默认值,设置遵循从右至左原则例如:fun(x=0,y=1),fun(x,y=1),但不可以是fun(x=1,y)形参设置可以
- 凡搞WEB开发的人都离不开HTTP(超文本传输协议),而要了解HTTP,除了HTML本身以外,还有一部分不可忽视的就是HTTP消息头。做过S
- 为什么要使用滤波消除图像中的噪声成分叫作图像的平滑化或滤波操作。信号或图像的能量大部分集中在幅度谱的低频和中频段是很常见的,而在较高频段,感
- SQL Server日期计算 通常,你需要获得当前日期和计算一些其他的
- # 查看下centos7.6上的python版本[root@registry ~]# cat /etc/redhat-releaseLinu
- 可以直接参考官方文档:https://docs.microsoft.com/zh-cn/sql/linux/quickstart-insta
- 方法 bindParam() 和 bindValue() 非常相似。 唯一的区别就是前者使用一个PHP变量绑定参数,而后者使用一个值。 所以
- 介绍:仅供技术交流学习探讨,请勿用于非法用途,。本文部分资源来源于网络,如有侵权请联系版主删除。一、简介Burp Intruder是一个强大
- 一、基于socket实现的TCP客户端import socket # 建立socket对象# 参数一表示IP地址类型(AF_INE
- 一、argparse介绍官方文档argparse 模块是 Python 内置的一个用于命令项选项与参数解析的模块,argparse 模块可以
- 1.通过工具"DTS"的设计器进行导入或者导出DTS的设计器功能强大,支持多任务,也是可视化界面,容易操作,但知道的人一