使用Python为图片添加空间相关噪声(相干噪声)

当我们进行图像处理、计算机视觉或深度学习任务时,通常需要对图像数据添加一些噪声。通过添加噪声,我们可以使模型更加鲁棒,防止过拟合,并提高泛化能力。而空间相关噪声是一种特殊类型的噪声,它在像素之间存在一定的相关性,即相邻像素之间的噪声具有相关性。这种噪声通常被称为“空间相关噪声”或“相干噪声”。

空间相关噪声可以模拟真实世界中的许多噪声类型,如图像传感器噪声、光学系统噪声、背景噪声等。此外,空间相关噪声还可以模拟其他信号处理任务中的噪声,如声音信号处理和信号传输等。

添加空间相关噪声的一个好处是可以更准确地模拟真实世界中的噪声,从而提高模型的鲁棒性和泛化能力。此外,由于空间相关噪声是一种比较复杂的噪声类型,可以使模型更加具有挑战性,从而更好地评估模型的性能。

那么需要如何做呢? 本文分成两个部分,第一部分是使用np来生成一个1channel的噪音,第二部分是用torch生成一个batch的3channel的噪音。

对于生成协方差矩阵我们使用了Matérn协方差函数,它是一种广泛应用于空间统计学和地理信息系统中的协方差函数。Matérn协方差函数的一般形式如下:

C(r) = frac{sigma^2}{2^{nu -1}Gamma(nu)}left(frac{sqrt{2nu}r}{rho}right)^{nu}K_{nu}left(frac{sqrt{2nu}r}{rho}right)


目录

一、使用np生成灰度噪音。

二、使用pytorch生成一个batch的彩色噪音。


一、使用np生成灰度噪音。

import numpy as np
from scipy.spatial.distance import cdist

def generate_correlated_noise(image, rho=1.0):
    n, m = image.shape
    pos = np.dstack(np.meshgrid(np.arange(n), np.arange(m))).reshape(-1, 2) # positions of the pixels
    d = cdist(pos, pos) # Euclidean distance matrix
    cov = (1.0 + np.sqrt(3.0) * d / rho) * np.exp(-np.sqrt(3.0) * d / rho) # Matérn covariance matrix
    noise = np.random.multivariate_normal(mean=np.zeros(n*m), cov=cov) # generate noise
    noise = noise.reshape(n, m) # reshape noise to the same shape as the input image
    return noise

当然我程序里面并没有跟Matérn协方差函数一一对照,我实在是懒得对平了,不好意思,嘻嘻。但是不妨碍这是一篇好文章,啊哈哈哈哈。

给大家一个测试的程序吧,可以测试一下你生成的噪音。

import matplotlib.pyplot as plt

image = np.zeros((100, 50)) # example input image
noise = generate_correlated_noise(image, rho=1.0) # generate noise
plt.imshow(noise, cmap='gray')
plt.show()

多个channel的简单处理的话只需要调用三次generate_correlated_noise()然后拼接一下就可以了,如果想更高效可以在np.random.multivariate_normal()上下文章,我没记错的话这个函数应该是可以一次生成多个sample的。简单整理也可以变成一个batch的data。我没细致处理这个,我主要处理的还是在下面的Pytorch version上。


二、使用pytorch生成一个batch的彩色噪音。

跟np不同,pytorch是产生一个可以生产出一个channel的噪音的类,调用这个类只需要.sample即可。代码如下:

import torch
import math

def generate_correlated_noise_batch(images, rho=1.0):
    batch_size, channels, height, width = images.shape # 我这里输入的直接是一个batch的data了哈
    pos_x, pos_y = torch.meshgrid(torch.arange(height), torch.arange(width))
    pos = torch.stack([pos_x, pos_y], dim=-1).float().reshape(-1, 2)
    d = torch.cdist(pos, pos).float()
    cov = (1.0 + math.sqrt(3.0) * d / rho) * torch.exp(-math.sqrt(3.0) * d / rho)
    MultivariateNormal_ = torch.distributions.MultivariateNormal(loc= torch.zeros(height*width), covariance_matrix = cov)
    return MultivariateNormal_ #返回一个noise的生成器的类
MultivariateNormal_ = generate_correlated_noise_batch(images, rho=1.0)
noise = torch.stack([torch.stack([MultivariateNormal_.sample().view(images.shape[2],images.shape[3]) for i in range(images.shape[0])], dim=0) for i in range(3)],dim=1) # 直接顶上一个batch的噪音

生成的协方差矩阵。

左边是原图,右边是根号sigma = 50 的时候产生的噪音。

最后需要指出的是,添加空间相关噪声也需要谨慎,因为它可能会对某些任务产生负面影响,如图像识别任务。在这种情况下,添加空间相关噪声可能会使图像中的细节变得模糊,从而降低识别准确性。因此,在使用空间相关噪声时,需要根据具体任务进行权衡和选择。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>