OpenCV学习笔记(十一)——图像噪声的生成(椒盐噪声、高斯噪声)
目录
- 1 椒盐噪声
- 2 高斯噪声
图像在获取和传输过程种会受到随机信号的干扰从而产生噪声,例如电阻引起的热噪声、光子噪声、暗电流噪声以及光响应非均匀性噪声等,由于噪声会影响对图像的理解以及后续的处理工作,因此去除噪声的影响在图像中具有十分重要的意义。图像中常见的噪声有:椒盐噪声、高斯噪声、泊松噪声和乘性噪声。本文将介绍椒盐噪声和高斯噪声产生的原因和如何在图像中添加噪声。生成的含有噪声的图像可以应用于后续的滤波处理中。
1 椒盐噪声
椒盐噪声又称作脉冲噪声,会随机改变图像中的像索值,是相机、传输通道、解码处理等过程中产生的黑白相间的亮暗点噪声。它就像在图像上随机撒上的一些盐粒 和黑胡椒粒,因此而得名。OpenCV4 中没有提供专门为图像添加椒盐噪声的函数,需要使用者根据自己需求编写生成椒盐噪声的程序。
考虑到椒盐噪声会随机产生在图像中的任何一个位置,因此要生成椒盐噪声,我们需要用到随机数生成函数。由于NumPy在数据处理中的优异表现,对于随机数的生成,我们可以使用np.random.randint()函数。
#np.random.randint()函数原型
output = np.random.randint(low[, high[, size[, dtype]]])
其中各返回值和参数的含义分别为:
low:生成的随机数的最小值
high:生成的随机数的最大值
size:生成的随机数的维度
dtype:生成的随机数的格式
该函数可以用于随机数的生成,并将生成的随机数通过值返回。生成的随机数范围是[low,high),包括low但不包括high 。
向图像中添加椒盐噪声的步骤如下:
(1)确定添加椒盐噪声的位置。根据椒盐噪声会随机出现在图像中的任何一个位置的特性, 我们可以利用np.random.randint()函数生成两个随机数,分别用于确定椒盐噪声产生的行和列。
(2)确定噪声的种类。不仅椒盐噪声的位置是随机的,噪声是黑色的还是白色同样是随机的,因此可以再次生成随机数,通过判断随机数是0还是1来确定该像素是白色噪声还是黑色噪声。
(3)修改图像像素的灰度值。判断图像通道数,对于通道数不同的图像,表示像素白色的方式也不相同。若图像为多通道的,则每个通道中的值都将改变;否则,只需要改变单通道中的一个值。
(4)得到含有椒盐噪声的图像。
示例代码
# -*- coding:utf-8 -*-
import cv2 as cv
import numpy as np
import sysdef add_noisy(image, n=10000):result = image.copy()w, h = image.shape[:2]for i in range(n):# 分别在宽和高的范围内生成一个随机值,模拟代表x, y坐标x = np.random.randint(1, w)y = np.random.randint(1, h)if np.random.randint(0, 2) == 0:# 生成白色噪声(盐噪声)result[x, y] = 0else:# 生成黑色噪声(椒噪声)result[x, y] = 255return resultif __name__ == '__main__':# 读取图像并判断是否读取成功img = cv.imread('../images/cat.jpg')if img is None:print('Failed to read cat.jpg.')sys.exit()# 灰度图像添加椒盐噪声gray_image = cv.cvtColor(img, cv.COLOR_BGR2GRAY)gray_image_noisy = add_noisy(gray_image, 10000)# 彩色图像添加椒盐噪声color_image_noisy = add_noisy(img, 10000)# 展示结果cv.imshow("Gray Image", gray_image)cv.imshow("Gray Image Noisy", gray_image_noisy)cv.imshow("Color Image", img)cv.imshow("Color Image Noisy", color_image_noisy)cv.waitKey(0)cv.destroyAllWindows()
运行结果如下图所示。
2 高斯噪声
高斯噪声是指噪声分布的概率密度函数服从高斯分布(正态分布)的一类噪声,其产生的主要原因是在拍摄时视场较暗且亮度不均匀,这会产生高斯噪声。除此之外,电子元器件自身的噪声和它们互相影响也是造成高斯噪声的重要原因。高斯噪声的概率密度函数如下式所示。
p(z)=12πσe−(z−μ)22σ2p(z)=\frac{1}{\sqrt{2 \pi} \sigma} \mathrm{e}^{\frac{-(z-\mu)^{2}}{2 \sigma^{2}}} p(z)=2πσ1e2σ2−(z−μ)2
其中,zzz 表示图像像素的灰度值;μ\muμ 表示像素值的平均值或期望值;
σ\sigmaσ 表示像素的标准差,标准差的平方 (σ2)(\sigma^2)(σ2)。椒盐噪声随机出现在图像中的任意位置,高斯噪声出现在图像中所有位置。
OpenCV4中没有专门提供为图像添加高斯噪声的函数,对照在图像中添加椒盐噪声的过程,我们可以利用产生随机数的函数来对图像添加高斯噪声。NumPy中提供了可以产生符合高斯分布(正态分布)的随机数的 np.random.normal()函数。
#np.random.normal()函数原型
output = np.random.normal(loc,scale[, size])
其中各返回值和参数的含义分别为:
loc:高斯分布的平均值
scale:高斯分布的标准差
size:输出的随机数据维度
该函数用于生成一个指定形状的符合高斯分布的随机数,并将生成的结果通过值返回。第1个参数对应整个高斯分布的中心。第2个参数对应高斯分布的宽度。scale 值越大,分布越扁平;反之,分布越高耸。第3个参数为可选参数,可根据需求进行输出尺寸的设置,若未指定,则仅输出单个值。当参数loc设置为0,scale 设置为1时,即代表标准正态分布。
在图像中添加高斯噪声的过程大致分为以下3个步骤。
(1) 根据图像尺寸,使用np.random.normal()函数生成符合高斯分布的随机数矩阵。
(2)将原图像和生成的随机数矩阵相加。
(3)得到添加高斯噪声之后的图像。
依照上述思想,示例程序用于对灰度图像和彩色图像添加高斯噪声。由于高斯噪声是随机生成的,因此每次运行结果会有差异。
示例代码
# -*- coding:utf-8 -*-
import cv2 as cv
import numpy as np
import sysdef add_noise(image, mean=0, val=0.01):size = image.shapeimage = image / 255gauss = np.random.normal(mean, val ** 0.5, size)noise = image + gaussreturn gauss, noiseif __name__ == '__main__':# 读取图像并判断是否读取成功img = cv.imread('../images/cat.jpg')if img is None:print('Failed to read cat.jpg.')sys.exit()# 灰度图像添加高斯噪声gray_image = cv.cvtColor(img, cv.COLOR_BGR2GRAY)gray_gauss, gray_noisy_image = add_noise(gray_image)# 彩色图像添加高斯噪声color_gauss, color_noisy_image = add_noise(img)# 展示结果cv.imshow("Gray Image", gray_image)cv.imshow("Gray Noisy Image", gray_noisy_image)cv.imshow("Color Image", img)cv.imshow("Color Noisy Image", color_noisy_image)cv.waitKey(0)cv.destroyAllWindows()
运行结果如下图所示,结果中展示了向灰度图象和RGB图像中添加高斯噪声的结果。
OpenCV学习笔记(十一)——图像噪声的生成(椒盐噪声、高斯噪声)相关推荐
- OpenCV学习笔记(九)——图像轮廓(下)
<OpenCV轻松入门:面向Python>学习笔记(九) 1-3 查找并绘制轮廓.矩特性及Hu矩 4-5 轮廓拟合及凸包 6. 利用形状场景算法比较轮廓 6.1 计算形状场景距离 6.2 ...
- C++下opencv学习笔记(一)(图像的简单读取丶显示与存储)
C++下opencv学习笔记(一)(图像的简单读取丶显示与存储) 前言 学习C++ OpenCV,第一需要具备面向对象语言的基础,第二要对图像处理机器学习有基础了解,容易入门.觉得自己基础已经有了可以 ...
- Opencv学习笔记(八) -- 图像色彩空间转换
1.常见图像色彩空间 RGB RGB色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红.绿.蓝三个通道 ...
- OpenCV学习笔记(七)——图像梯度及边缘检测
图像梯度计算的是图像变化的速度.对于图像的边缘部分,其灰度值变化较大,梯度值也较大:相反,对于图像中比较平滑的部分,其灰度值变化较小,相应的梯度值也较小.一般情况下,图像梯度计算的是图像的边缘信息. ...
- [OpenCV学习笔记3][图像的加载+修改+显示+保存]
正式进入OpenCV学习了,前面开始的都是一些环境搭建和准备工作,对一些数据结构的认识主要是Mat类的认识: [1.学习目标] 图像的加载:imread() 图像的修改:cvtColor() 图像的显 ...
- OpenCV学习笔记之图像融合
一.线性融合操作 线性混合操作 也是一种典型的二元(两个输入)的 像素操作 : 通过在范围 内改变 ,这个操可以用来对两幅图像或两段视频产生时间上的 画面叠化 (cross-dissolve)效果 ...
- OpenCV学习笔记(一):生成随机矩阵
引言: 众所周知,OpenCV对图像的处理是把图像作为一个二维矩阵来进行了,(i,j)表示图像中第i行第j列位置,而A(i,j)则表示此位置上的值(灰度值).因此,作为OpenCV第一课笔记,先学习下 ...
- (_cai_) opencv学习笔记(1):图像形态学计算的方式 morphology函数的应用
1.腐蚀 概述:腐蚀掉图像的细节.若图像有很多毛刺,通过腐蚀操作,可以将毛刺消除. 下面所说的"值"可以简单理解为RGB三个通道[0,255],值越小,亮度越低,值越大,亮度越高. ...
- Opencv学习笔记四——图像形态学操作
需要的库和自定义函数 import cv2 import numpy as np import matplotlib.pyplot as pltdef cv_show(name, mat):cv2.i ...
- OpenCV学习笔记五-图像混合
将两张图片混合 P6 图像混合 #include<iostream> #include<opencv2/opencv.hpp>using namespace std; usin ...
最新文章
- Community Server :: Forums
- 高考成绩2021年怎么查询,2021高考成绩怎么查询 2021年各省市高考成绩查询时间介绍...
- bzoj 3687: 简单题
- Redux中的重要概念
- S/4HANA的生产订单,哪个字段可以用来做生产完成的标志位
- python正则匹配找到所有的浮点数_如何利用Python抓取静态网站及其内部资源
- 【Java每日一题】20170302
- maven详解scope
- mysql8.0 创建用户并授权
- C语言基础知识【作用域规则】
- [2018.07.21 T2] 离家出走
- 轻松学网络设备之思科交换机搭建虚拟局域网
- 原神3.2私人服务器搭建
- 雷达多普勒频率计算公式_智能驾驶之眼-毫米波雷达技术详解
- Plotly基础教程
- Windows 7装机必备 - 主流品牌驱动大集合
- Java IO完全总结(转载) --- 重点在源码分析
- 一名中专生的坎坷程序人生
- 征战希洛克集卡活动显示服务器没角色,希洛克征战模式
- Instagram Win10 UWP版更新:新增故事滤镜等大波功能
热门文章
- dingtalk 一个让钉钉服务端开发更简单的golang工具库
- 2022年10月大学英语B统考题库网考大学英语B试题(完整版)
- 全国省市区及其编码React、Vue、小程序通用
- CentOS-7-aarch64-Everything-2009和CentOS-7-aarch64-Minimal-2009,缺省装了什么?
- 蝉知 路径index.php,蝉知CMS系统部署中的一些问题的解决方法
- android自定义尺寸模拟器,Android模拟器尺寸随意改
- [转载]在Vmware ESXI中安装群晖Synology DSM 5.0 (4528)
- 泰坦服务器装系统,深海泰坦X8Ti笔记本安装win10系统操作方法
- 最优化理论中的方法概述
- frame.pack()