Python中的imnoise?

时间:2014-04-09 15:57:32

标签: python noise

我正在尝试在应用低通滤波器后为图像添加白噪声。我知道如何在matlab中完成它,但不知道要在python中使用它。

import matplotlib.pyplot as plt
import numpy as np
import scipy.misc
from scipy import ndimage
import Image 

J = imnoise(im,'salt & pepper',0.02);
figure.imshow(J)

我还需要导入什么?还是有另一种方法来增加噪音?

4 个答案:

答案 0 :(得分:5)

scikit-image提供了一个函数random_noise,类似于MATLAB中的imnoise

skimage.util.random_noise(image, mode='gaussian', seed=None, clip=True, **kwargs)

它支持以下模式:

  

'高斯'高斯分布的加性噪声​​。

     

'localvar'高斯分布的加性噪声​​,具有指定的   每个图像点的局部方差

     

'poisson'从数据中产生的泊松分布噪声。

     

'salt'用1替换随机像素。

     

'pepper'用0替换随机像素。

     

& p'用0或1替换随机像素。

     

'斑点'使用out = image + n *图像的乘法噪声,其中   n是具有指定平均值的均匀噪声。方差。

注意与MATLAB中imnoise的一个不同之处在于此函数的输出始终是浮点图像。

例如,如果输入图像是uint8灰度图像,则它首先会转换为浮点数,但输出图像不会转换为与输入图像相同的类。

因此,如果您关心图像类,则应自行转换输出,例如使用skimage.img_as_ubyte

答案 1 :(得分:2)

在讨论去噪时,本教程会在noisy = l + 0.4 * l.std() * np.random.random(l.shape)的图像中添加白噪声 其中l是图像。

http://scipy-lectures.github.io/advanced/image_processing/#denoising

一般情况下,您应该只需添加一个填充了您想要用于原始图片的噪点的矩阵即可添加噪点。

答案 2 :(得分:1)

  1. 代码示例。

    import numpy as np
    import cv2
    from matplotlib import pyplot as plt
    from skimage.util import random_noise
    
    I = cv2.imread('image.jpg', 1); # 1/ -1: color mode; 0: gray mode
    gauss = random_noise(I, mode='gaussian', seed=None, clip=True)
    sp = random_noise(I, mode='s&p', seed=None, clip=True)
    
    plt.subplot(231), plt.imshow(I), plt.title('Origin')
    plt.subplot(232), plt.imshow(gauss), plt.title('Gaussian')
    plt.subplot(233), plt.imshow(sp), plt.title('Salt & Pepper')
    plt.show();
    
  2. 更多信息:http://scikit-image.org/docs/0.13.x/api/skimage.util.html#skimage.util.random_noise

答案 3 :(得分:0)

  

虽然没有像matlab那样的内置函数   “imnoise(image,noiseType,Amount_of_Noise)”​​但我们可以轻松添加随机值脉冲噪声的 必需 金额 或手工制作盐和胡椒。

<强> 1。添加随机值脉冲噪声。

import random as r
def addRvinGray(image,n): # add random valued impulse noise in grayscale 
    '''parameters: 
            image: type=numpy array. input image in which you want add noise.
            n:  noise level (in percentage)'''
    k=0                  # counter variable 
    ih=image.shape[0]    
    iw=image.shape[1]
    noisypixels=(ih*iw*n)/100      # here we calculate the number of pixels to be altered.

    for i in range(ih*iw):
        if k<noisypixels:
                image[r.randrange(0,ih)][r.randrange(0,iw)]=r.randrange(0,256) #access random pixel in the image gives random intensity (0-255)              
            k+=1
        else:
            break
    return image

<强>&GT;添加盐和胡椒噪音

import random as r
def addSaltGray(image,n): #add salt-&-pepper noise in grayscale image

    k=0
    salt=True
    ih=image.shape[0]
    iw=image.shape[1]
    noisypixels=(ih*iw*n)/100

    for i in range(ih*iw):
        if k<noisypixels:  #keep track of noise level
                if salt==True:
                        image[r.randrange(0,ih)][r.randrange(0,iw)]=255
                        salt=False
                else:
                        image[r.randrange(0,ih)][r.randrange(0,iw)]=0
                        salt=True
                k+=1
        else:
            break
    return image
  

注意:对于彩色图像:首先将图像分割为三个或四个   使用opencv函数取决于输入图像的通道:(B,G,R)   = cv2.split(图像)(B,G,R,A)= cv2.split(图像)分割后在所有通道上执行相同的操作。最后合并所有   渠道:merged = cv2.merge([B,G,R])返回合并我希望这会有所帮助。