iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >如何利用python正确地为图像添加高斯噪声
  • 409
分享到

如何利用python正确地为图像添加高斯噪声

2024-04-02 19:04:59 409人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录彩图or灰度图uint8orfloat64方差or标准差是否截断(clip)总结参考开门见山,直接使用 skimage 库为图像添加高斯噪声是很简单的: import skima

开门见山,直接使用 skimage 库为图像添加高斯噪声是很简单的:

import skimage

origin = skimage.io.imread("./lena.png")
noisy = skimage.util.random_noise(origin, mode='gaussian', var=0.01)

但是如果不用库函数而自己实现的话,有几个问题是值得注意的。

彩图 or 灰度图

读取图片时,图片可能是有三通道的RGB图片,也有可能是单通道的灰度图,甚至四通道的RGBA图。

通道数不同会影响图像数据的 shape ,例如: (256, 256, 3) 、(256, 256)

很多人按照MATLAB的习惯,使用 np.random.randn 来生成高斯噪声,则需要根据通道数调整参数。

# RGB
noise = sigma * np.random.randn(256, 256, 3)
# GRAY
noise = sigma * np.random.randn(256, 256)

为了通用的处理,最好使用 np.random.nORMal 生成高斯噪声。

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

前两个参数分别为 均值和标准差,第三个参数为生成数据的 shape,直接将图像本身shape输入进去,更加优雅。

uint8 or float64

一般遇到的图像都是8bit的,用skimage或OpenCV读取后会发现数据类型是uint8的ndarray,取值范围是 [0, 255] 。

如果手贱直接在整型数据上添加高斯噪声,如:

image = io.imread("lena.png")
noise = np.random.normal(0, 10, image.shape)
noisy = image + noise

你会发现 plt.imshow 出来的是一片空白,或者有零星几个噪点。

以一个像素为例分析原因:

  • 图像本身是[0, 255]的整数:[226 137 125]
  • 生成的噪声是浮点数:[-2.92864248 4.04786763 12.23436435]
  • 相加后最后的数据:[223.07135752 141.04786763 137.23436435]

matplotlib 的 imshow 要求输入是 (0-1 float or 0-255 int),所以上述不伦不类的数据是无法正确显示的(只显示了恰好落在0-1之间的像素)。

int or float

在很多应用中,为了方便计算,都会将图像数据转换为浮点数,float64,取值范围为 [0, 1]

为了转换数据类型,最简单的方式是直接除以255:

image = io.imread("./lena.png")
print(image.dtype)					# uint8

image = image/255
print(image.dtype)					# float64

更稳妥的做法,可以使用skimage的img_to_float()

image = img_as_float(image)

这样再添加高斯噪声就可以正确显示。

方差 or 标准差

高斯噪声符合一个均值为0,方差为 σ 2 \sigma^2 σ2 的高斯分布。

均值为0,是保证图像的亮度不会有变化,而方差大小则决定了高斯噪声的强度。

方差/标准差越大,噪声越强。

这里有一点点初中数学的细节,就是在[0, 1]区间内, y = x y=\sqrt{x} y=x ​ 比 y = x y=x y=x 要大。

sqrtx

所以,设置方差为0.1,噪声要比设置标准差为0.1大不少。注意不要用混了就可以。

sigma

是否截断(clip)

由于需要把噪声叠加到原图像中,因此叠加后的数据值就可能超出对应数据类型的取值范围

如果用matplotlib显示超出范围的彩色图像,则可能遇到以下提示:

Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for integers).

matplotlib自动将图片做了截断。

而不知为何,matplotlib并不会自动对灰度图进行截断,例如:

clip

叠加噪声之后,图片数据的最小值和最大值分别为 -0.32 和 1.25,这明显超过了[0, 1]的范围。

这样显示出的图片是不正确的(中间图像),更像是重新将图像缩放到了[0, 1]范围内,就像将色阶向外扩了一样,对比度也下降了。

使用 np.clip,将图像截断到 [0, 1]之间,如右图所示,图像明显正常了很多。

总结

完整的代码如下:

from skimage import io, img_as_float
import numpy as np

mean = 0
var = 0.01

image = io.imread("./lena.png")

image = img_as_float(image)
noise = np.random.normal(mean, var**0.5, image.shape)
noisy = image + noise
noisy = np.clip(noisy, 0.0, 1.0)

当然,上述问题在 skimage.util.random_noise 中都已解决,工程中可以直接使用。

import skimage

origin = skimage.io.imread("./lena.png")
noisy = skimage.util.random_noise(origin, mode='gaussian', var=0.01)

推荐学习skimage的源码

参考

https://zhuanlan.zhihu.com/p/50820267

Https://www.jb51.net/article/241120.htm

https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.imshow.html

https://GitHub.com/scikit-image/scikit-image/blob/v0.17.2/skimage/util/noise.py#L8

到此这篇关于如何利用python正确地为图像添加高斯噪声的文章就介绍到这了,更多相关Python为图像加高斯噪声内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 如何利用python正确地为图像添加高斯噪声

本文链接: https://www.lsjlt.com/news/142785.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何利用python正确地为图像添加高斯噪声
    目录彩图or灰度图uint8orfloat64方差or标准差是否截断(clip)总结参考开门见山,直接使用 skimage 库为图像添加高斯噪声是很简单的: import skima...
    99+
    2024-04-02
  • Python实现图像随机添加椒盐噪声和高斯噪声
    目录1.常见的图像噪声(1)高斯噪声(2) 椒盐噪声2.生成图像噪声(1)高斯噪声(2) 椒盐噪声(速度慢)(3) 椒盐噪声(快速版)3. Demo性能测试 图像噪声是指存...
    99+
    2024-04-02
  • 图像处理:随机添加椒盐噪声和高斯噪声Python
    图像处理:随机添加椒盐噪声和高斯噪声Python 目录 图像处理:随机添加椒盐噪声和高斯噪声Python 1.常见的图像噪声 (1)高斯噪声 (2) 椒盐噪声 2.生成图像噪声 (1)高斯噪声 (2) 椒盐噪声(速度慢) (3) 椒盐噪声(...
    99+
    2023-08-31
    高斯噪声 椒盐噪声 快速生成椒盐噪声 图像添加噪声 图像噪声
  • Python实现对图像加噪(高斯噪声椒盐噪声)
    目录内容简介加噪声的代码(高斯噪声,椒盐噪声)在pytorch中如何使用补充内容简介 展示如何给图像叠加不同等级的椒盐噪声和高斯噪声的代码,相应的叠加噪声的已编为对应的类,可实例化使...
    99+
    2024-04-02
  • Python怎么实现对图像添加高斯噪声或椒盐噪声
    这篇文章主要为大家展示了“Python怎么实现对图像添加高斯噪声或椒盐噪声”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Python怎么实现对图像添加高斯噪声或椒盐噪声”这篇文章吧。加噪声的代码...
    99+
    2023-06-21
  • 利用python3如何给数据添加高斯噪声
    目录Background原始数据源码总结Background 高斯噪声,顾名思义是指服从高斯分布(正态分布)的一类噪声。有的时候我们需要向标准数据中加入合适的高斯噪声让数据更加符合实...
    99+
    2024-04-02
  • python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
    目录1、高斯噪声2、椒盐噪声3、泊松噪声4、speckle噪声导读: 这篇文章主要介绍如何利用opencv来对图像添加各类噪声,原图: 1、高斯噪声 高斯噪声就是给图片添加一个服从...
    99+
    2024-04-02
  • 如何用python给数据加上高斯噪声
    目录python给数据加上高斯噪声回顾MATLAB中的加高斯噪声Python中利用numpy给数据加噪声python批量给图形添加噪声高斯噪声椒盐噪声随机噪声总结python给数据加...
    99+
    2023-05-19
    python数据 python高斯噪声 python数据高斯噪声
  • python怎么使用opencv对图像添加噪声
    本篇内容主要讲解“python怎么使用opencv对图像添加噪声”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python怎么使用opencv对图像添加噪声”吧!原图:1、高斯噪声高斯噪声就是给...
    99+
    2023-06-29
  • Opencv图像添加椒盐噪声、高斯滤波去除噪声原理以及手写Python代码实现方法
    目录一、噪声 二、噪声的分类三、图像中添加椒盐噪声四、基于滤波器方法去噪五、opencv高斯滤波调包 总结 一、噪声   我们将常会...
    99+
    2024-04-02
  • 利用OpenCV给彩色图像添加椒盐噪声的方法
    目录一、图像噪声二、椒盐噪声三、C++代码四、结果展示1、原图2、添加椒盐噪声五、python代码六、结果展示1、原图2、添加椒盐噪声七、总结一、图像噪声 图像噪声是图像在获取或者传...
    99+
    2024-04-02
  • Python如何实现为图像添加下雪特效
    这篇文章主要为大家展示了“Python如何实现为图像添加下雪特效”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Python如何实现为图像添加下雪特效”这篇文章吧。导语也许是为了和音,在立冬这一天...
    99+
    2023-06-22
  • vue如何利用openlayers加载天地图和高德地图
    这篇文章给大家分享的是有关vue如何利用openlayers加载天地图和高德地图的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、天地图部分1、在vue中安装openlayersnpm i -...
    99+
    2023-06-25
  • 如何利用Python将彩色图像转为灰度图像
    小编给大家分享一下如何利用Python将彩色图像转为灰度图像,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!第一种方法Python的cv2库中自带彩色转灰度的方法,...
    99+
    2023-06-22
  • 如何利用Python和OpenCV对图像进行加水印详解
    目录前言🌌 第 1 步:导入 OpenCV 并读取logo和要应用水印的图像💨 第 2步:计算两个图像的高度和宽度🚀 第 3 步:将水...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作