加性零均值高斯噪声的产生与信噪比SNR的计算

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-1 11:53   784   0

噪声:引起图像受一些随机误差的影响的退化,噪声可能与图像内容有关,也可能无关。

白噪声:具有常量的功率谱,在所有频率上出现且强度相同的理想的噪声。

高斯噪声:服从高斯正态分布概率的一种白噪声。

在一维下,高斯正太分布概率的密度函数为:

加性噪声:噪声出现与图像信息本身无关的独立于信号的退化噪声。加噪后图像矩阵J可直接表示为:J=I+v,其中v为噪声矩阵。

加性零均值高斯噪声的产生:

设图像I的灰度值范围为[0,255],取任意数sigma>0,代表噪声的大小程度。

循环:取每对左右相邻的像素点(i,j)与(i,j+1)【如果(i,j)为最右侧点可以跳过或者只对这个点进行加噪】,分别执行如下操作:

1.产生位于[0,1]的随机数r,phi。

2.计算:

3 .加噪后该像素点对应位置计算如下:

J(i,j)=I(i,j)+z1; J(i,j+1)=I(i,j+1)+z2;

4.取下一对左右相邻的像素点直至遍历结束。

遍历完后,J内的像素值可能存在大于255或者小于0的情况,可遍历每个点进行判断,如果大于255则置为255,小于0则置为0,或对J内的像素点进行归一化,另最大的点按比例调整为255,最小的调整为0。

%% Gaussian noise
J=zeros(m,n,d);
sigma=5*rand(1);
for i=1:m
    for j=1:2:n
        r=rand(1);
        phi=rand(1);
        z1=sigma*cos(2*pi*phi)*sqrt(-2*log(r));
        z2=sigma*sin(2*pi*phi)*sqrt(-2*log(r));
        for k=1:d
            J(i,j,k)=I_od(i,j,k)+z1;%I_id为原始图 
            if j+1<=n
                J(i,j+1,k)=I_od(i,j+1,k)+z2;
            end
        end
    end
end
for i=1:m
    for j=1:n
        for k=1:d
            if J(i,j,k)>255%如果大于255则置为255
                J(i,j,k)=255;
            elseif J(i,j,k)<0
                J(i,j,k)=0;
            end
        end
    end
end
J=uint8(J);
figure,
subplot(121),imshow(I_od);
subplot(122),imshow(J);   

其中[m,n,d]为原始图像(未加噪图像)的高、宽和色深,彩色则d=3,否则为1。matlab中log()函数表示数学里的ln,而log10()函数表示以10为底,常数e可通过exp(1)获得,pi在matlab中默认定义为3.1416。rand(1)为返回一个1*1的0-1取值的矩阵,也就是返回一个0-1的随机数。在之前为了区分原图像和对应的灰度图像,用I表示灰度图像,I_od表示原图像:

I=imread('lena.jpg');
I_od=I;
[m,n,d]=size(I_od);
if ndims(I)==3%如果为RGB图像则转为灰度
    I=rgb2gray(I);
end

如果本身就是灰度图像,I和I_od为同样大小。matlab中isrgb已不可用,可以替换成ndims(I)==3或者size(I,3)==3。

也可直接通过J=imnoise(I, 'gaussian', 均值,方差)实现。

运行结果如下:

左侧为原始图像,右侧为加噪图像

左侧为原始图像,右侧为加噪图像

根据噪声v,可定义信噪比SNR(Signal-to-Noise Radio),表示图像(或信号)中噪声占总信息数的比例。

首先计算噪声v的所有平方和:

观察到的噪声后信号所有平方和:

信噪比则为E与F的比值:

信噪比又常用他的对数表示,单位为分贝(dB):

上面加噪后图像J的信噪比计算代码如下:

V=I_od-J;
E=sum(sum(sum(V.^2)));
F=sum(sum(sum(J.^2)));
SNR=F/E;
SNRdB=10*log10(SNR);

直接用加噪后图像和原图像的差值来获得噪声矩阵V,矩阵的平方用V.^2获得,平方和直接sum(sum(V.^2)),因为可能是彩色图像,V为三阶段矩阵,所以要在多进行一次sum(总共三次sum,可能存在一个函数计算矩阵所有元素之和)。

信噪比越大,代表图像质量越好。

除了加性噪声外,很多情况下噪声的大小和图像本身信息有关。

例如:1.乘性噪声:J=I*v,多出现于电视的光栅退化。

2.量化噪声,多出现在量化级别(即灰度级)不足的情况,伪轮廓。

3.冲击噪声:图像像素被个别噪声破坏,被破坏的像素值与邻域内像素值差别较大,椒盐噪声为饱和的冲击噪声,他使得被破坏的像素的像素值要么为255(白盐),要么为0(黑椒)。

全部可运行代码:(包括直方图那一篇的代码)

%% hist
I=imread('rgb.jpg');
I_od=I;
[m,n,d]=size(I_od);
if ndims(I)==3%如果为RGB图像则转为灰度
    I=rgb2gray(I);
end
%[h,p]=imhist(I);
h=zeros(256,1);
for i=1:m
    for j=1:n
        gray=I(i,j);
        h(gray+1,1)=h(gray+1,1)+1;
    end
end
h=h/sum(h);

K=5;
hf=zeros(256,1);
for i=1:size(h,1)
    for j=-K:K
        if i+j>=1 && i+j<=255
            hf(i,1)=hf(i,1)+h(i+j,1)/(2*K+1);
        end
    end
end
bar(h);
axis([0,255,0,max(h)*1.1]);
figure;
bar(hf);
axis([0,255,0,max(hf)*1.1]);
%% Entropy
Entropy=0;
for i=1:256
    if h(i)~=0
        Entropy=Entropy-h(i)*log(h(i))/log(2);
    end
end
%% Gaussian noise
J=zeros(m,n,d);
sigma=10*rand(1);
for i=1:m
    for j=1:2:n
        r=rand(1);
        phi=rand(1);
        z1=sigma*cos(2*pi*phi)*sqrt(-2*log(r));
        z2=sigma*sin(2*pi*phi)*sqrt(-2*log(r));
        for k=1:d
            J(i,j,k)=I_od(i,j,k)+z1;%I_id为原始彩色图 
            if j+1<=n
                J(i,j+1,k)=I_od(i,j+1,k)+z2;
            end
        end
    end
end
for i=1:m
    for j=1:n
        for k=1:d
            if J(i,j,k)>255%如果大于255则置为255
                J(i,j,k)=255;
            elseif J(i,j,k)<0
                J(i,j,k)=0;
            end
        end
    end
end
J=uint8(J);
figure,
subplot(121),imshow(I_od);
subplot(122),imshow(J);      


V=I_od-J;
E=sum(sum(sum(V.^2)));
F=sum(sum(sum(J.^2)));
SNR=E/F;
SNRdB=10*log10(SNR);

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP