Fork me on GitHub

随笔 - 997  文章 - 5  评论 - 181  阅读 - 300万 

  数字图像的随机噪声在图像处理中有着重要的位置,今天用到了,就回顾一下。做个总结。

  随机噪声很多种,最常用的一般有两种,高斯噪声和椒盐噪声,下面我们就针对这两种噪声做个科普。

高斯噪声:高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声与椒盐噪声相似(Salt And Pepper Noise),高斯噪声(gauss noise)也是数字图像的一个常见噪声。椒盐噪声是出现在随机位置、噪点深度基本固定的噪声,高斯噪声与其相反,是几乎每个点上都出现噪声、噪点深度随机的噪声。

正如上面的简介我们只要实现一个随机矩阵,矩阵中值总体来说符合高斯分布,与原图像想加,就可以实现高斯噪声了,python中的random提供了产生高斯随机数的方法,但是numpy提供了直接生成随机高斯矩阵的方法。

复制代码
我们这里使用numpy即可

gauss = np.random.normal(mean,sigma,(row,col,ch))
因此我们可以得出产生高斯噪声的方式

def GaussieNoisy(image,sigma):
    row,col,ch= image.shape
    mean = 0
    gauss = np.random.normal(mean,sigma,(row,col,ch))
    gauss = gauss.reshape(row,col,ch)
    noisy = image + gauss
    return noisy.astype(np.uint8)
复制代码

  图像结果:

  

椒盐噪声:相比高斯噪声,椒盐噪声的概念非常简单,即在图像中随机选点,使其为0或255。

实现代码:

复制代码
def spNoisy(image,s_vs_p = 0.5,amount = 0.004):
    row,col,ch = image.shape

    out = np.copy(image)
    num_salt = np.ceil(amount * image.size * s_vs_p)
    coords = [np.random.randint(0, i - 1, int(num_salt))  for i in image.shape]
    out[coords] = 1
    num_pepper = np.ceil(amount* image.size * (1. - s_vs_p))
    coords = [np.random.randint(0, i - 1, int(num_pepper)) for i in image.shape]
    out[coords] = 0
    return out
复制代码

  图片效果:

    总体代码:

复制代码
import cv2
import numpy as np
import matplotlib.pyplot as plt
import scipy
import scipy.stats


def GaussieNoisy(image,sigma):
    row,col,ch= image.shape
    mean = 0
    gauss = np.random.normal(mean,sigma,(row,col,ch))
    gauss = gauss.reshape(row,col,ch)
    noisy = image + gauss
    return noisy.astype(np.uint8)

def spNoisy(image,s_vs_p = 0.5,amount = 0.004):
    row,col,ch = image.shape

    out = np.copy(image)
    num_salt = np.ceil(amount * image.size * s_vs_p)
    coords = [np.random.randint(0, i - 1, int(num_salt))  for i in image.shape]
    out[coords] = 1
    #num_pepper = np.ceil(amount * image.size * (2. - s_vs_p))
    num_pepper = np.ceil(amount * image.size * (1 - 0.5))
    coords = [np.random.randint(0, i - 1, int(num_pepper)) for i in image.shape]
    out[coords] = 0
    return out

apple = cv2.imread("girl8.jpg")
apple = cv2.resize(cv2.cvtColor(apple,cv2.COLOR_BGR2RGB),(400,800))
#plt.imshow(apple)
plt.imshow(GaussieNoisy(apple,25))
#plt.imshow(spNoisy(apple,25))
plt.savefig('girl_gs.jpg')
plt.axis("off")
plt.show()
复制代码

  参考文档:

1 https://www.cnblogs.com/lynsyklate/p/8047510.html 

posted on   虚生  阅读(1789)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示