1. randn()
首先来说一下randn()这个函数,它是默认产生一个期望为0,标准差为1的正态分布,具体生成的是向量还是矩阵都是自行控制,比如下面这样可以产生一个期望为1,标准差为2的正态分布矩阵:
r=1+2.*randn(2,2)
r =
-1.0327 0.2521
1.0459 -0.7869
于是下面我们可以用randn()给图像添加均值为0,标准差为10,方差为100的高斯白噪声了:
origImg = imread(‘Lena.bmp’);
figure, imshow(origImg,[])
% 关于此处用double的解释:原图是uint8格式的数据,而randn函数生成的是float类
% 型的数据,因此要进行数据类型转换
distImg = double(origImg) + 10*randn(size(origImg));
figure, imshow(distImg,[])
noise = distImg - double(origImg);
figure,imshow(noise,[])
var = var(double(noise(😃)) % 方差
std = std2(noise) % 标准差
mean = mean2(noise) % 二维数组的均值
var =
101.0287
std =
10.0513
mean =
-0.0105
可以看到,所求出来的基本符合预期了。
2. wgn()
官方文档是这样写的:
y = wgn(m,n,power) generates an m-by-n matrix of white Gaussian noise. power specifies the power of y in decibels relative to a watt. The default load impedance is 1 ohm.
然后附加了一个例子:
% Generate a 1000-element column vector
% containing real white Gaussian noise of power 0 dBW.
y1 = wgn(1000,1,0);
% Confirm that the power is approximately 0 dBW, that is, 1 W.
var(y1)
ans = 0.9979
从上面的例子我们可以明白过来,其实产生的噪声的方差就是第三个参数的值,只不过在代码中要将其按照分贝(dB)来设置。我们常见的分贝是度量声音强度的单位。其转换公式为P(dB)=10lgP(W)。于是有了:
y = wgn(m,n,p) 产生一个m行n列的高斯白噪声的矩阵,p以dBW为单位指定输出噪声的强度(方差)。
同理,将上述添加噪声那句代码改为:
distImg=double(origImg) + wgn(size(origImg,1),size(origImg,2),20);
1
即可得到:
var =
99.7863
std =
9.9893
mean =
0.0065
也是符合要求的。
原文:https://blog.csdn.net/liuyingying0418/article/details/79432962?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allfirst_rank_v2~rank_v25-1-79432962.nonecase