【OpenCV-Python】:对图像添加高斯噪声与椒盐噪声

✨博客主页:王乐予🎈
✨年轻人要:Living for the moment(活在当下)!💪
🏆推荐专栏:【图像处理】【千锤百炼Python】【深度学习】【排序算法

😺一、高斯噪声

高斯噪声指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。

🐶1.1 API添加

🦄1.1.1 函数API

我们需要使用skimage库中的函数为图像添加高斯噪声。

函数式:skimage.util.random_noise(image, mode=‘gaussian’, seed=None, clip=True, **kwargs)

参数介绍:

函数式:skimage.util.random_noise(image, mode=‘gaussian’, seed=None, clip=True, **kwargs)

参数介绍:
image:输入图像,类型为ndarray;
mode:噪声类别,有以下几种:
    'gaussian':高斯噪声;
    'localvar':高斯分布的加性噪声,在图像每个点都有特点的局部方差;
    'poisson':泊松噪声;
    'salt':盐噪声,随机将图像像素值变为1'pepper':椒噪声,随机将图像像素值变为0-1's&p':椒盐噪声;
    'speckle':均匀噪声,(均值mean方差variance),out=image+n*image,n是具有指定均值和方差的均匀噪声;
seed:可选,int型,如果选择的话,则会在生成噪声前设置随机种子;
clip:可选,bool型,若为True(default)则在加入‘speckle’,‘poisson’,或 ‘gaussian’这三种噪声后,
      进行剪切以保证图像数据点都在[0,1][-1.1]之间。若为False,则数据可能超出这个范围;
mean:可选,float型,用于’gaussian’和‘speckle’的均值设置,默认为0;
var:可选,float型,用于’gaussian’和‘speckle’的方差设置,默认为0.01;
local_vars:可选,ndarray型,用于‘localvar’的图像每个像素点处的局部方差设置;
amount:可选,float型,用于‘salt’,‘pepper’和‘s&p’的噪声比例,默认为0.05;
salt_vs_pepper:可选,float型,用于's&p'中盐噪声与椒噪声的比例,范围为[0, 1],默认为0.5

🦄1.1.2 程序设计

from skimage import util
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np

img1 = Image.open(r"G:\picture\lena1.jpg")
img = np.array(img1)

noisy1 = util.random_noise(img, mode='gaussian', mean=0, var=0.01)
noisy2 = util.random_noise(img, mode='gaussian', mean=0.1, var=0.01)
noisy3 = util.random_noise(img, mode='gaussian', mean=0, var=0.2)

plt.subplot(221)
plt.title('original')
plt.xticks([])   # remove ticks
plt.yticks([])
plt.imshow(img1)

plt.subplot(222)
plt.title('mean=0, var=0.01')
plt.xticks([])   # remove ticks
plt.yticks([])
plt.imshow(noisy1)

plt.subplot(223)
plt.title('mean=0.1, var=0.01')
plt.xticks([])   # remove ticks
plt.yticks([])
plt.imshow(noisy2)

plt.subplot(224)
plt.title('mean=0, var=0.2')
plt.xticks([])   # remove ticks
plt.yticks([])
plt.imshow(noisy3)

plt.show()

🦄1.1.3 运行结果

在这里插入图片描述

🐶1.2 自定义函数添加

🦄1.2.1 程序设计

import numpy as np
import cv2

def gaussian_noise(image, mean, var):

    image = np.array(image / 255, dtype=float)
    noise = np.random.normal(mean, var ** 0.5, image.shape)
    out = image + noise

    if out.min() < 0:
        low_clip = -1.
    else:
        low_clip = 0.

    out = np.clip(out, low_clip, 1.0)
    out = np.uint8(out * 255)

    return out

image = cv2.imread(r"G:\picture\lena1.jpg")

noisy1 = gaussian_noise(image, mean=0, var=0.01)
noisy2 = gaussian_noise(image, mean=0.1, var=0.01)
noisy3 = gaussian_noise(image, mean=0, var=0.2)

h1 = np.hstack([image, noisy1])
h2 = np.hstack([noisy2, noisy3])
v = np.vstack([h1, h2])

cv2.imshow('out', v)
cv2.waitKey()

🦄1.2.2 运行结果

在这里插入图片描述

😺二、椒盐噪声

椒盐噪声也称为脉冲噪声,是图像中经常见到的一种噪声,它是一种随机出现的白点或者黑点。

🐶2.1 API添加

🦄2.1.1 程序设计

from skimage import util
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
import cv2

img1 = Image.open(r"G:\picture\lena1.jpg")
img = np.array(img1)

noisy1 = util.random_noise(img, mode='s&p', amount=0.05)
noisy2 = util.random_noise(img, mode='s&p', amount=0.1)
noisy3 = util.random_noise(img, mode='s&p', amount=0.2)

plt.subplot(221)
plt.title('original')
plt.xticks([])   # remove ticks
plt.yticks([])
plt.imshow(img1)

plt.subplot(222)
plt.title('amount=0.05')
plt.xticks([])   # remove ticks
plt.yticks([])
plt.imshow(noisy1)

plt.subplot(223)
plt.title('amount=0.1')
plt.xticks([])   # remove ticks
plt.yticks([])
plt.imshow(noisy2)

plt.subplot(224)
plt.title('amount=0.2')
plt.xticks([])   # remove ticks
plt.yticks([])
plt.imshow(noisy3)

plt.show()

🦄2.1.2 运行结果

在这里插入图片描述

🐶2.2 自定义函数添加

🦄2.2.1 程序设计

import numpy as np
import cv2
import random

def sp_noise(image, amount):

    output = image.copy()
    threshold = 1 - amount

    for i in range(image.shape[0]):
        for j in range(image.shape[1]):
            rdm = random.random()
            if rdm < amount:
                output[i][j] = 0
            elif rdm > threshold:
                output[i][j] = 255

    return output

image = cv2.imread(r"G:\picture\lena1.jpg")

noisy1 = sp_noise(image, amount=0.05)
noisy2 = sp_noise(image, amount=0.1)
noisy3 = sp_noise(image, amount=0.2)

h1 = np.hstack([image, noisy1])
h2 = np.hstack([noisy2, noisy3])
v = np.vstack([h1, h2])

cv2.imshow('out', v)
cv2.waitKey()

🦄2.2.2 运行结果

在这里插入图片描述

  • 19
    点赞
  • 116
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王乐予

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值