【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 运行结果

在这里插入图片描述

### 如何在Python中生成或去除高斯噪声 #### 生成高斯噪声 为了向图像添加高斯噪声,可以定义一个函数`gaussian_noise`来完成此操作。该函数接收一张原始图像作为输入,并允许指定均值和标准差参数用于控制所添加高斯噪声特性[^2]。 ```python import numpy as np def gaussian_noise(image, mean=0, sigma=0.1): """ 向给定图像添加高斯噪声 参数: image (numpy.ndarray): 输入的原始图像数组. mean (float): 高斯分布的均值,默认为0. sigma (float): 高斯分布的标准差,默认为0.1. 返回: numpy.ndarray: 加入了高斯噪声之后的新图像. """ # 归一化到浮点数范围并准备计算 img_normalized = np.array(image / 255, dtype=float) # 创建具有相同尺寸的随机高斯噪声矩阵并原图相加 noisy_img = img_normalized + np.random.normal(mean, sigma, img_normalized.shape) # 裁剪超出[0,1]区间的像素值再转换回整型表示法 result = np.clip(noisy_img, 0, 1) * 255 return result.astype('uint8') ``` 对于上述代码中的`np.random.normal()`部分,这里利用了NumPy库提供的功能来创建符合特定正态(即高斯)分布特性的随机数值集合;这些数值随后被加入到了原有的图像数据之中从而实现了人为制造含有一定水平高斯干扰成分的效果。 #### 去除高斯噪声的方法之一——平均滤波器 针对已经受到污染的数据集而言,采用简单的线性空间域平滑技术如算术均值过滤是一种常见手段用来减轻由零均值独立同分布(i.i.d.)随机过程引起的扰动影响程度。下面给出了一种基于OpenCV库实现此类算法的方式: ```python import cv2 def apply_mean_filter(image, kernel_size=(5, 5)): """ 应用均值模糊以减少高斯噪音的影响 参数: image (numpy.ndarray): 待处理含噪图像. kernel_size (tuple of int): 卷积核大小,默认为(5,5). 返回: numpy.ndarray: 经过均值滤波后的干净图像. """ filtered_image = cv2.blur(src=image, ksize=kernel_size) return filtered_image ``` 通过调用OpenCV内置函数`cv2.blur()`,能够方便快捷地执行窗口内所有像素求平均的操作进而达到抑制局部高频变化的目的。值得注意的是,在实际应用当中可能还需要考虑更多因素比如边缘保护等问题以便获得更佳视觉效果以及保持特征完整性[^3]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

王乐予

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

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

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

打赏作者

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

抵扣说明:

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

余额充值