zoukankan      html  css  js  c++  java
  • python数字图像处理---噪声的应用

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

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

    高斯噪声:高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声与椒盐噪声相似(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 

  • 相关阅读:
    【嵌入式开发】写入开发板Linux系统-模型S3C6410
    大约cocos2d-X 3.x使用引擎版本自带的物理引擎Physics
    它们的定义PropertyPlaceHolder无法完成更换任务
    [Cocos2d-x]在Cocos2d-x 3.x如何通过版本号WebSocket连接server数据的传输
    Java 内存架构
    类似的微博推断客户关系sql声明
    Kienct与Arduino学习笔记(2) 深度图像与现实世界的深度图的坐标
    etl工具,kettle实现了周期
    Android中自定义checkbox样式
    ndroid网络(4):HttpClient必经之路----使用线程安全的单例模式HttpClient,及HttpClient和Application的融合
  • 原文地址:https://www.cnblogs.com/dylancao/p/9122740.html
Copyright © 2011-2022 走看看