基于Python为二值图像添加已知方差或SNR的高斯噪声
二值图像添加高斯噪声及相关问题解答
一、你的现有代码分析
你当前实现的不是高斯噪声,而是椒盐噪声(脉冲噪声):它以15%的概率随机翻转像素值(0变1,1变0),属于离散的脉冲型噪声,和高斯噪声(连续正态分布的噪声)完全不同。
二、如何给二值图像添加高斯噪声
高斯噪声是服从正态分布的连续噪声,添加时需要注意二值图像的像素范围(0/1),通常有两种处理方式:保留浮点型像素值(适合后续复原算法),或者截断到0-1区间。
1. 已知噪声方差的情况
直接使用numpy.random.normal生成对应方差的高斯噪声,叠加到图像上:
import numpy as np import cv2 def add_gaussian_noise(im, var): # 确保图像是浮点型(避免整数溢出) im_float = im.astype(np.float32) # 生成均值为0,方差为var的高斯噪声,形状和图像一致 noise = np.random.normal(loc=0.0, scale=np.sqrt(var), size=im.shape) # 叠加噪声 im_noisy = im_float + noise # 可选:截断到0-1范围(如果需要保持像素在原二值区间) im_noisy = np.clip(im_noisy, 0.0, 1.0) return im_noisy
- 参数说明:
var是噪声的方差,scale参数需要传入方差的平方根(即标准差)。
2. 已知SNR的情况
SNR(信噪比)的定义为信号功率与噪声功率的比值,高斯噪声的功率等于其方差(因为均值为0)。步骤如下:
- 计算原二值图像的信号功率:对于0/1二值图,信号功率等于图像的方差(
np.var(im)),因为信号的均值为μ(像素为1的比例),方差为μ*(1-μ),这就是信号的功率。 - 根据SNR计算噪声方差:
- 如果SNR是线性比值(如SNR=2表示信号功率是噪声的2倍):
noise_var = signal_power / SNR - 如果SNR是**分贝(dB)**形式:先转成线性比值
SNR_linear = 10 ** (SNR_dB / 10),再计算noise_var = signal_power / SNR_linear
- 如果SNR是线性比值(如SNR=2表示信号功率是噪声的2倍):
实现代码:
def add_gaussian_noise_by_snr(im, snr, is_db=True): im_float = im.astype(np.float32) # 计算信号功率 signal_power = np.var(im_float) if is_db: # 分贝转线性比值 snr_linear = 10 ** (snr / 10) else: snr_linear = snr # 计算噪声方差 noise_var = signal_power / snr_linear # 生成并叠加噪声 noise = np.random.normal(loc=0.0, scale=np.sqrt(noise_var), size=im.shape) im_noisy = im_float + noise im_noisy = np.clip(im_noisy, 0.0, 1.0) return im_noisy
三、你的椒盐噪声代码的方差与SNR计算
1. 噪声方差计算
假设原图像的像素均值为μ(即图像中1的占比),你的噪声是:85%概率噪声为0,15%概率噪声为1-2x(x是原像素值,0或1,所以1-2x的值为1或-1)。
- 噪声的均值:
E[n] = 0.15 * (1 - 2μ) - 噪声的二阶矩:
E[n²] = 0.15 * 1 + 0.85 * 0 = 0.15(因为(1-2x)²=1,不管x是0还是1) - 噪声方差:
Var(n) = E[n²] - (E[n])² = 0.15 - (0.15*(1-2μ))²
如果原图像中0和1各占50%(μ=0.5),则噪声均值为0,方差为0.15 - 0 = 0.15。
2. SNR计算
信号功率为原图像的方差:signal_power = μ*(1-μ)
线性SNR为:SNR_linear = signal_power / Var(n)
分贝SNR为:SNR_dB = 10 * np.log10(SNR_linear)
同样以μ=0.5为例:
- 信号功率=0.5*0.5=0.25
- SNR_linear=0.25/0.15≈1.667
- SNR_dB≈10*log10(1.667)≈2.22dB
内容的提问来源于stack exchange,提问作者Amir Mohseni
相关产品推荐
相关产品推荐

