图像预处理(2)图像去噪之噪声的分类

一、噪声的分类

首先,我们先了解一下噪声的分类,据我目前了解到的噪声有高斯噪声,泊松噪声,椒盐噪声,瑞利噪声,爱尔兰(伽马)噪声,均匀噪声,周期性分布噪声还有指数分布噪声

1.高斯噪声

高斯噪声_百度百科 (baidu.com)

高斯噪声是指服从高斯分布(正态分布)的一类噪声,其产生的主要原因是由于相机在拍摄时视场较暗且亮度不均匀造成的,同时相机长时间工作使得温度过高也会引起高斯噪声,另外电路元器件白身噪声和互相影响也是造成高斯噪声的重要原因之一。

下面是我查阅到的添加高斯噪声的代码,引入的模块和之前一致,这里我就不在赘述了

#对图像添加高斯噪声
def add_gauss_noise(image, mean=0, val=0.01):
    size = image.shape
    #对图像归一化处理
    image = image / 255
    gauss = np.random.normal(mean, val **0.05, size)
    image = image + gauss
    return image


img = cv2.imread('n.jpg')#''中替换成需要添加噪声的图片路径
if img is None:
    print('Failed to read the image')
cv2.imshow('img', img)
cv2.waitKey(0)

img1 = add_gauss_noise(img)#调用加高斯噪声的函数
cv2.imshow('img1', img1)
cv2.waitKey(0)

结果图:

下面是我查阅到的另一种添加高斯噪声的代码,此代码加噪用的是numpy库中用于生成正态分布(也叫高斯分布)随机数的函数,即np.random.normal函数


#产生高斯随机数
noise = np.random.normal(0,50, size=img.size).reshape(img.shape[0], img.shape[1], img.shape[2])

#加上噪声(高斯噪声)
img = img + noise
img = np.clip(img,0,255)
img = img / 255

cv2.imshow('Gauss noise', img)
cv2.waitKey(0)

np.random.normal-CSDN博客

该函数有三个参数:loc, scale, size

loc表示随机数的期望值(对应着整个分布的中心),float ,loc=0说明这一个以Y轴为对称轴的正态分布

scale表示随机数的标准差。float ,(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)

size表示生成的随机数的个数。int or tuple of ints 输出的shape,默认为None,只输出一个值

代码运行的结果如下,左面是灰度化之后的图片,右面是加入高斯噪声后的图片

结果图:

2.泊松噪声

泊松噪声即符合泊松分布的噪声模型,又称散粒噪声。泊松分布适合于描述单位时间内随机事件发生的次数的概率分布。

下面是我查阅到的添加泊松噪声的代码,和上面高斯噪声的第二种方法类似,也是引入了numpy库中的np.random.poisson函数

import cv2
import random
import numpy as np
img = cv2.imread('m.jpg')

# 产生泊松噪声,引入了numpy库中的np.random.poisson函数
noise = np.random.poisson(lam=20,size=img.shape).astype('uint8')
#lam泊松分布的λ

#加上噪声
img = img + noise
np.clip(img,0,255)
img = img/255

cv2.imshow('Poisson noise',img)
cv2.waitKey(0)

结果图:

将lam修改为1所得结果为

3.椒盐噪声

椒盐噪声_百度百科 (baidu.com)

椒盐噪声也称为脉冲噪声,是图像中经常见到的一种噪声,它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。椒盐噪声的成因可能是影像讯号受到突如其来的强烈干扰而产生、类比数位转换器或位元传输错误等。例如失效的感应器导致像素值为最小值,饱和的感应器导致像素值为最大值。

python+OpenCv笔记(八):图像噪声(椒盐噪声、高斯噪声)_椒盐图像噪声-CSDN博客

import cv2
import random
import numpy as np

img = cv2.imread('m.jpg')#读取图片

def sp_noise(image, prob):#prob:信噪比
 
    output = np.zeros(image.shape, np.uint8)
    thres = 1 - prob
    for i in range(image.shape[0]):
        for j in range(image.shape[1]):
            rdn = random.random()
            if rdn < prob:
                output[i][j] = 0
            elif rdn > thres:
                output[i][j] = 255
            else:
                output[i][j] = image[i][j]
    return output


img_sp = sp_noise(img, prob=0.02)

# 显示图像
cv2.imshow("src", img)
cv2.imshow("sp", img_sp)
cv2.waitKey(0)
cv2.destroyAllWindows()

 信噪比不知道是什么的看这里哦~信噪比的定义及计算方法_信噪比计算-CSDN博客

如果还是分不太清高斯噪声,泊松噪声,椒盐噪声,可以点下方链接

浅析“高斯白噪声”,“泊松噪声”,“椒盐噪声”的区别 - 简书 (jianshu.com)

4.瑞利噪声

参考文章图像噪声、去噪基本方法合集(Python实现)_点降噪代码python-CSDN博客

import cv2
import random
import numpy as np

img = cv2.imread('m.jpg')
cv2.imshow('m.jpg', img)
cv2.waitKey(0)

#产生瑞利噪声
sigma = 50.0#这里可自行修改数值
noise = np.random.rayleigh(sigma, size=img.shape)

#加上噪声
img = img + noise
np.clip(img,0,255)
img = img/255

cv2.imshow('Rayleigh noise',img)
cv2.waitKey(0)
print(img.shape)

 运行结果图

该文章中另一个代码为

import cv2
import random
import numpy as np

img = cv2.imread('m.jpg')
cv2.imshow('m.jpg', img)
cv2.waitKey(0)

# 产生瑞利噪声
sigma = 50.0
noise = np.random.rayleigh(img, size=img.shape)

# 加上噪声
img = img + noise
np.clip(img,0,255)
img = img/255

cv2.imshow('Rayleigh noise',img)
cv2.waitKey(0)
print(img.shape)

结果为: 

5.爱尔兰(伽马)噪声

Erlang噪声_百度百科 (baidu.com)

Erlang噪声又称作伽马(爱尔兰)噪声,服从了伽马曲线的分布,是图像处理中的一种噪声模型。

import cv2
import numpy as np
image=cv2.imread("j.jpg")
# 生成伽马噪声
shape, scale = 10.0,10.0  # 设置伽马分布的参数
gamma_noise = np.random.gamma(shape, scale, image.shape).astype('uint8')

# 将噪声叠加到图像上
noisy_image = cv2.add(image, gamma_noise)

# 显示带噪声的图像
cv2.imshow('Noisy Image with Gamma Noise', noisy_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

6.均匀噪声

  均匀分布噪声是指它的概率密度函数服从均匀分布的一类噪声。均匀分布是概率统计中的重要分布之一。顾名思义,均匀,表示可能性相等的含义。

参考文章图像噪声、去噪基本方法合集(Python实现)_点降噪代码python-CSDN博客

import cv2
import numpy as np

img=cv2.imread("j.jpg")#""内同样要改成自己图片的路径哦~
#均匀噪音(从numpy库中调用函数)
noise = np.random.uniform(50,10,img.shape)
#给图片加上噪音
img = img + noise
np.clip(img,0,255)
img = img/255

#显示带噪声的图像
cv2.imshow('Noisy Image with Gamma Noise', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

7.周期性分布噪声

周期性噪声是一种在图像或信号中以特定频率和振幅重复出现的噪声。它通常以正弦或余弦波形的形式呈现,具有明显的周期性结构。周期性噪声可以在图像处理、信号处理和音频处理等领域中出现。

代码参考图像数据噪音种类以及Python生成对应噪音_python生成正态分布的噪声-CSDN博客

import numpy as np
import cv2

#定义噪声函数
def generate_periodic_noise(image_shape, frequency):
    x = np.arange(image_shape[1])
    y = np.arange(image_shape[0])
    xx, yy = np.meshgrid(x, y)
    noise = np.sin(2 * np.pi * frequency * xx / image_shape[1])
    return noise

# 读取图片
image = cv2.imread('j.jpg', cv2.IMREAD_COLOR)

# 生成周期性噪声
frequency = 0.1  # 调整此参数以改变噪声频率
periodic_noise = generate_periodic_noise(image.shape[:2], frequency)

# 将噪声映射到 0-255 范围内
periodic_noise = ((periodic_noise - periodic_noise.min()) / (periodic_noise.max() - periodic_noise.min()) * 255).astype('uint8')

# 扩展维度以匹配图像的通道数
periodic_noise = np.stack((periodic_noise,) * 3, axis=-1)

# 将噪声叠加到图像上
noisy_image = cv2.add(image, periodic_noise.astype(np.uint8))

# 显示带噪声的图像
cv2.imshow('Noisy Image with Periodic Noise', noisy_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

8.指数分布噪声

指数分布噪声是指它的概率密度函数服从指数分布的一类噪声。

目前还未找到指数分布噪声相关的Python代码,如果大家找到了希望可以与大家一起互相分享学习交流


写在后面的话:

目前在实现掌纹方面的识别,正在努力中,后续会持续展示我的一些算法成果,此篇文章仅供参考,目的是为了可以更好的梳理自己所查阅的知识,同时也希望可以让大家找资料的时候方便一些吧,文章中如果存在一些问题请即使和我沟通哈,如果大家有什么更好的提议也可以互相交流呀,谢谢大家啦

如果有对掌纹方面或者识别方面感兴趣的欢迎大家加我的QQ哦~

qq:2311035985(为了研究新开的小号嘿嘿,放心加啦)

如果有什么好的提议或见解也欢迎大家加我QQ一起讨论哦~

猜你喜欢

转载自blog.csdn.net/Siren_dream/article/details/136840070