Python实现图像随机添加椒盐噪声和高斯噪声

目录
  • 1.常见的图像噪声
    • (1)高斯噪声
    • (2) 椒盐噪声
  • 2.生成图像噪声
    • (1)高斯噪声
    • (2) 椒盐噪声(速度慢)
    • (3) 椒盐噪声(快速版)
  • 3. Demo性能测试

图像噪声是指存在于图像数据中的不必要的或多余的干扰信息。在噪声的概念中,通常采用信噪比(Signal-Noise Rate, SNR)衡量图像噪声。通俗的讲就是信号占多少,噪声占多少,SNR越小,噪声占比越大。

1.常见的图像噪声

(1)高斯噪声

高斯噪声Gaussian noise,是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声,通常是因为不良照明和高温引起的传感器噪声。

(2) 椒盐噪声

椒盐噪声salt-and-pepper noise,又称为脉冲噪声,它是一种随机出现的白点(盐噪声)或者黑点(椒噪声),通常是由图像传感器,传输信道,解压处理等产生的黑白相间的亮暗点噪声(椒-黑,盐-白)。常用的去除这种噪声的有效手段是使用中值滤波器。

2.生成图像噪声

在原始图像基础上加上噪声分量,即可生成图像噪声

(1)高斯噪声

def gaussian_noise(image, mean=0.1, sigma=0.1):
    """
    添加高斯噪声
    :param image:原图
    :param mean:均值
    :param sigma:标准差 值越大,噪声越多
    :return:噪声处理后的图片
    """
    image = np.asarray(image / 255, dtype=np.float32)  # 图片灰度标准化
    noise = np.random.normal(mean, sigma, image.shape).astype(dtype=np.float32)  # 产生高斯噪声
    output = image + noise  # 将噪声和图片叠加
    output = np.clip(output, 0, 1)
    output = np.uint8(output * 255)
    return output

(2) 椒盐噪声(速度慢)

常规的方法,需要遍历每个像素,添加椒盐噪声,该方法十分缓慢。Python语言十分不建议进行图像像素遍历操作,毕竟性能太差,速度太慢了(除非写成C/C++版本)。我们可以借助numpy的矩阵处理,实现快速的添加椒盐噪声。

def salt_pepper_noise(image: np.ndarray, prob=0.01):
    """
    添加椒盐噪声,该方法需要遍历每个像素,十分缓慢
    :param image:
    :param prob: 噪声比例
    :return:
    """
    for i in range(image.shape[0]):
        for j in range(image.shape[1]):
            if random.random() < prob:
                image[i][j] = 0 if random.random() < 0.5 else 255
            else:
                image[i][j] = image[i][j]
    return image

(3) 椒盐噪声(快速版)

我们可以借助numpy的矩阵处理,实现快速的添加椒盐噪声。基本思路:利用np.random.uniform生成0~1的均匀噪声( uniform distribution noise),然后将noise > prob的像素设置0或者255,这样通过矩阵的处理,可以快速添加椒盐噪声。

def fast_salt_pepper_noise(image: np.ndarray, prob=0.02):
    """
    随机生成一个0~1的mask,作为椒盐噪声
    :param image:图像
    :param prob: 椒盐噪声噪声比例
    :return:
    """
    image = add_uniform_noise(image, prob * 0.51, vaule=255)
    image = add_uniform_noise(image, prob * 0.5, vaule=0)
    return image

def add_uniform_noise(image: np.ndarray, prob=0.05, vaule=255):
    """
    随机生成一个0~1的mask,作为椒盐噪声
    :param image:图像
    :param prob: 噪声比例
    :param vaule: 噪声值
    :return:
    """
    h, w = image.shape[:2]
    noise = np.random.uniform(low=0.0, high=1.0, size=(h, w)).astype(dtype=np.float32)  # 产生高斯噪声
    mask = np.zeros(shape=(h, w), dtype=np.uint8) + vaule
    index = noise > prob
    mask = mask * (~index)
    output = image * index[:, :, np.newaxis] + mask[:, :, np.newaxis]
    output = np.clip(output, 0, 255)
    output = np.uint8(output)
    return output

3. Demo性能测试

需要用到pybaseutils工具,pip安装即可

# -*-coding: utf-8 -*-
"""
    @Author : panjq
    @E-mail : pan_jinquan@163.com
    @Date   : 2022-07-27 15:23:24
    @Brief  :
"""
import cv2
import random
import numpy as np
from pybaseutils import time_utils

@time_utils.performance("gaussian_noise")
def gaussian_noise(image, mean=0.1, sigma=0.1):
    """
    添加高斯噪声
    :param image:原图
    :param mean:均值
    :param sigma:标准差 值越大,噪声越多
    :return:噪声处理后的图片
    """
    image = np.asarray(image / 255, dtype=np.float32)  # 图片灰度标准化
    noise = np.random.normal(mean, sigma, image.shape).astype(dtype=np.float32)  # 产生高斯噪声
    output = image + noise  # 将噪声和图片叠加
    output = np.clip(output, 0, 1)
    output = np.uint8(output * 255)
    return output

@time_utils.performance("salt_pepper_noise")
def salt_pepper_noise(image: np.ndarray, prob=0.01):
    """
    添加椒盐噪声,该方法需要遍历每个像素,十分缓慢
    :param image:
    :param prob: 噪声比例
    :return:
    """
    for i in range(image.shape[0]):
        for j in range(image.shape[1]):
            if random.random() < prob:
                image[i][j] = 0 if random.random() < 0.5 else 255
            else:
                image[i][j] = image[i][j]
    return image

@time_utils.performance("fast_salt_pepper_noise")
def fast_salt_pepper_noise(image: np.ndarray, prob=0.02):
    """
    随机生成一个0~1的mask,作为椒盐噪声
    :param image:图像
    :param prob: 椒盐噪声噪声比例
    :return:
    """
    image = add_uniform_noise(image, prob * 0.51, vaule=255)
    image = add_uniform_noise(image, prob * 0.5, vaule=0)
    return image

def add_uniform_noise(image: np.ndarray, prob=0.05, vaule=255):
    """
    随机生成一个0~1的mask,作为椒盐噪声
    :param image:图像
    :param prob: 噪声比例
    :param vaule: 噪声值
    :return:
    """
    h, w = image.shape[:2]
    noise = np.random.uniform(low=0.0, high=1.0, size=(h, w)).astype(dtype=np.float32)  # 产生高斯噪声
    mask = np.zeros(shape=(h, w), dtype=np.uint8) + vaule
    index = noise > prob
    mask = mask * (~index)
    output = image * index[:, :, np.newaxis] + mask[:, :, np.newaxis]
    output = np.clip(output, 0, 255)
    output = np.uint8(output)
    return output

def cv_show_image(title, image, use_rgb=True, delay=0):
    """
    调用OpenCV显示RGB图片
    :param title: 图像标题
    :param image: 输入是否是RGB图像
    :param use_rgb: True:输入image是RGB的图像, False:返输入image是BGR格式的图像
    :return:
    """
    img = image.copy()
    if img.shape[-1] == 3 and use_rgb:
        img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)  # 将BGR转为RGB
    # cv2.namedWindow(title, flags=cv2.WINDOW_AUTOSIZE)
    cv2.namedWindow(title, flags=cv2.WINDOW_NORMAL)
    cv2.imshow(title, img)
    cv2.waitKey(delay)
    return img

if __name__ == "__main__":
    test_file = "test.png"
    image = cv2.imread(test_file)
    prob = 0.02
    for i in range(10):
        out1 = gaussian_noise(image.copy())
        out2 = salt_pepper_noise(image.copy(), prob=prob)
        out3 = fast_salt_pepper_noise(image.copy(), prob=prob)
        print("----" * 10)
    cv_show_image("image", image, use_rgb=False, delay=1)
    cv_show_image("gaussian_noise", out1, use_rgb=False, delay=1)
    cv_show_image("salt_pepper_noise", out2, use_rgb=False, delay=1)
    cv_show_image("fast_salt_pepper_noise", out3, use_rgb=False, delay=0)

循环机10次,salt_pepper_noise平均耗时125.49021ms,而fast_salt_pepper_noise平均耗时6.12011ms ,性能提高60倍左右,其生成的效果是基本一致的

call gaussian_noise elapsed: avg:19.42925ms     total:194.29255ms     count:10
call salt_pepper_noise elapsed: avg:125.49021ms     total:1254.90212ms     count:10
call fast_salt_pepper_noise elapsed: avg:6.12011ms     total:61.20110ms     count:10

原图

高斯噪声

salt_pepper_noise

fast_salt_pepper_noise

到此这篇关于Python实现图像随机添加椒盐噪声和高斯噪声的文章就介绍到这了,更多相关Python图像添加噪声内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python数字图像处理之估计噪声参数

    估计噪声参数 周期噪声的参数通常是通过检测图像的傅里叶谱来估计的. 只能使用由传感器生成的图像时,可由一小片恒定的背景灰度来估计PDF的参数. 来自图像条带的数据的最简单用途是,计算灰度级的均值和方差.考虑由 S S S表示的一个条带(子图像),并令 P S ( z i ) P_{S}(z_i) PS​(zi​), i = 0 , 1 , 2 , - , L − 1 i = 0, 1, 2, \dots, L-1 i=0,1,2,-,L−1表示 S S S中的像素灰度的概率估计(归一化直方图值)

  • python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)

    目录 1.高斯噪声 2.椒盐噪声 3.泊松噪声 4.speckle噪声 导读: 这篇文章主要介绍如何利用opencv来对图像添加各类噪声,原图: 1.高斯噪声 高斯噪声就是给图片添加一个服从高斯分布的噪声,可以通过调节高斯分布标准差(sigma)的大小来控制添加噪声程度,sigma越大添加的噪声越多图片损坏的越厉害 #读取图片 img = cv2.imread("demo.png") #设置高斯分布的均值和方差 mean = 0 #设置高斯分布的标准差 sigma = 25 #根据均值

  • Python实现对图像添加高斯噪声或椒盐噪声

    目录 内容简介 加噪声的代码(高斯噪声,椒盐噪声) 在pytorch中如何使用 内容简介 展示如何给图像叠加不同等级的椒盐噪声和高斯噪声的代码,相应的叠加噪声的已编为对应的类,可实例化使用.以下主要展示自己编写的: 加噪声的代码(高斯噪声,椒盐噪声) add_noise.py #代码中的noisef为信号等级,例如我需要0.7的噪声,传入参数我传入的是1-0.7 from PIL import Image import numpy as np import random import torch

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

    目录 彩图or灰度图 uint8orfloat64 方差or标准差 是否截断(clip) 总结 参考 开门见山,直接使用 skimage 库为图像添加高斯噪声是很简单的: import skimage origin = skimage.io.imread("./lena.png") noisy = skimage.util.random_noise(origin, mode='gaussian', var=0.01) 但是如果不用库函数而自己实现的话,有几个问题是值得注意的. 彩图 o

  • Python给图像添加噪声具体操作

    在我们进行图像数据实验的时候往往需要给图像添加相应的噪声,那么该怎么添加呢,下面给出具体得操作方法. 1.打开Python的shell界面,界面如图所示: 2.载入skimage工具包和其他的工具包,如图所示,代码如下: from skimage import io,data import numpy as np 3.采用以下指令读取图片: img=data.coffee() 4.采用以下指令填产生噪声: rows,cols,dims=img.shape for i in range(5000)

  • Python实现图像随机添加椒盐噪声和高斯噪声

    目录 1.常见的图像噪声 (1)高斯噪声 (2) 椒盐噪声 2.生成图像噪声 (1)高斯噪声 (2) 椒盐噪声(速度慢) (3) 椒盐噪声(快速版) 3. Demo性能测试 图像噪声是指存在于图像数据中的不必要的或多余的干扰信息.在噪声的概念中,通常采用信噪比(Signal-Noise Rate, SNR)衡量图像噪声.通俗的讲就是信号占多少,噪声占多少,SNR越小,噪声占比越大. 1.常见的图像噪声 (1)高斯噪声 高斯噪声Gaussian noise,是指它的概率密度函数服从高斯分布(即正态

  • python实现图像随机裁剪的示例代码

    实验条件: 从1张图像随机裁剪100张图像 裁剪出图像的大小为 60 x 60 IoU 大于等于 th=0.6 的裁剪框用红色标出,其它裁剪框用蓝色标出 IoU 比对原始区域用绿框标出 实验代码: import cv2 as cv import numpy as np np.random.seed(0) # get IoU overlap ratio def iou(a, b): # get area of a area_a = (a[2] - a[0]) * (a[3] - a[1]) # g

  • Python实现对图像加噪(高斯噪声 椒盐噪声)

    目录 内容简介 加噪声的代码(高斯噪声,椒盐噪声) 在pytorch中如何使用 补充 内容简介 展示如何给图像叠加不同等级的椒盐噪声和高斯噪声的代码,相应的叠加噪声的已编为对应的类,可实例化使用.以下主要展示自己编写的: 加噪声的代码(高斯噪声,椒盐噪声) add_noise.py #代码中的noisef为信号等级,例如我需要0.7的噪声,传入参数我传入的是1-0.7 from PIL import Image import numpy as np import random import to

  • 利用OpenCV给彩色图像添加椒盐噪声的方法

    目录 一.图像噪声 二.椒盐噪声 三.C++代码 四.结果展示 1.原图 2.添加椒盐噪声 五.python代码 六.结果展示 1.原图 2.添加椒盐噪声 七.总结 一.图像噪声 图像噪声是图像在获取或者传输过程中受到随机信号干扰,妨碍人们对图像理解及分析处理的信号.很多时候将图像看作随机过程,因而描述噪声的方法完全可以借用随机过程的描述,即使用其概率分布函数和概率密度分布函数.图像噪声的产生来自图像获取中的环境条件和传感元器件自身的质量,图像在传输过程中产生图像噪声的主要因素是所用的传输信道受

  • 使用Python-OpenCV向图片添加噪声的实现(高斯噪声、椒盐噪声)

    在matlab中,存在执行直接得函数来添加高斯噪声和椒盐噪声.Python-OpenCV中虽然不存在直接得函数,但是很容易使用相关的函数来实现. 代码: import numpy as np import random import cv2 def sp_noise(image,prob): ''' 添加椒盐噪声 prob:噪声比例 ''' output = np.zeros(image.shape,np.uint8) thres = 1 - prob for i in range(image.

  • python实现在函数图像上添加文字和标注的方法

    如下所示: import matplotlib.pyplot as plt import numpy as np from matplotlib import font_manager #先确定字体,以免无法识别汉字 my_font = font_manager.FontProperties(fname= "C:/Windows/Fonts/msyh.ttc") X=np.linspace(-np.pi,np.pi,100) plt.figure(figsize=(6,5)) Y_x2

  • python opencv 图像边框(填充)添加及图像混合的实现方法(末尾实现类似幻灯片渐变的效果)

    图像边框的实现 图像边框设计的主要函数 cv.copyMakeBorder()--实现边框填充 主要参数如下: 参数一:源图像--如:读取的img 参数二--参数五分别是:上下左右边的宽度--单位:像素 参数六:边框类型: cv.BORDER_CONSTANT--cv.BORDER_REPLICATE--cv.BORDER_REFLECT--cv.BORDER_WRAP--cv.BORDER_REFLECT_101--cv.BORDER_TRANSPARENT--cv.BORDER_REFLEC

  • python 给图像添加透明度(alpha通道)

    我们常见的RGB图像通常只有R.G.B三个通道,在图像处理的过程中会遇到往往需要向图像中添加透明度信息,如公司logo的设计,其输出图像文件就需要添加透明度,即需要在RGB三个通道的基础上添加alpha通道信息.这里介绍两种常见的向RGB图像中添加透明度的方法. 1.使用图像合成(blending)的方法 可参考上篇博文(python图像处理(十)--两幅图像的合成一幅图像(blending two images) ) 代码如下: #-*- coding: UTF-8 -*- from PIL

随机推荐