You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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)。步骤如下:

  1. 计算原二值图像的信号功率:对于0/1二值图,信号功率等于图像的方差(np.var(im)),因为信号的均值为μ(像素为1的比例),方差为μ*(1-μ),这就是信号的功率。
  2. 根据SNR计算噪声方差:
    • 如果SNR是线性比值(如SNR=2表示信号功率是噪声的2倍):noise_var = signal_power / SNR
    • 如果SNR是**分贝(dB)**形式:先转成线性比值SNR_linear = 10 ** (SNR_dB / 10),再计算noise_var = signal_power / SNR_linear

实现代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 18:54:38