matlab图像处理两种自编写方法添加高斯噪声

图像处理课程上,老师给出的任务是:往图像里添加高斯噪声,不使用自带的添加噪声函数。
于是,我查阅资料,找到了两种自编写的添加高斯噪声的方法,且他们都没有使用到opencv。

以下是方法的介绍:

1.方法一:反函数的方法
利用高斯噪声的概率密度函数PDF,通过积分可求出其累积分布函数CDF,利用均匀分布的语句rand(),产生一个均匀分布的随机数矩阵w,利用x=CDF-1(w),即求CDF的反函数,进而可得出高斯分布的随机数矩阵。
高斯分布的PDF为:
在这里插入图片描述
那么,高斯分布的CDF为:
在这里插入图片描述
而这个公式比较复杂,在写程序时,我们习惯用误差函数erf()来表示上面的CDF:
在这里插入图片描述
其反函数称为反误差函数:
在这里插入图片描述

2.方法二:Box-Muller方法
根据资料,我们可以先得到服从均匀分布的随机数再将服从均匀分布的随机数转变为服从正态分布。
其方法归纳为:
在这里插入图片描述

下面是我程序设计的流程图

1.反函数方法的:
在这里插入图片描述
2.Box-Muller方法的:
在这里插入图片描述

下面是我的Matlab程序

clear;clc;
%% 原图像输入与显示
image=imread('Lena.jpg');  %读取jpg图像
[width,height,z]=size(image);  %读取图像的大小
subplot(1,4,1);      %画子图个数,一共4个
imshow(image);      %画出原图 
title('原图');      %标题
%% 高斯分布的均值与标准差赋值
mu=0;  %均值
sigma=0.1;  %标准差
%% Box-Muller方法产生高斯分布
u1=rand(width,height);  %生成图像大小的均匀(0,1)分布的u1,u2
u2=rand(width,height);
x=sigma*sqrt(-2*log(u1)).*cos(2*pi*u2)+mu;  %box-muller方法的公式书写,生成的是标准正态分布,再乘上标准差,加上均值,为最终的高斯分布
result1=double(image)/255+x;  %将图像变为double型,且数值区间在(0,1),再加上高斯分布形成的噪声
result1=uint8(255*result1);   %将double类型的灰度值变回为图像
subplot(1,4,2);
imshow(result1);
title('BM方法加高斯噪声后的图像');
%% 反函数方法
f=rand(width,height);   %生成(0,1)均匀分布的随机数
y=sqrt(2)*erfinv(2*f-1); %反函数方法,用反误差函数求,求出的是标准正态分布的随机数
y=sigma*y+mu;   %乘以标准差,加上均值,成为一般的正态分布随机数,作为高斯噪声
result2=double(image)/255+y;
result2=uint8(255*result2);
subplot(1,4,3);
imshow(result2);
title('反函数方法加高斯噪声后的图像');
%% 自带imnoise函数产生高斯分布,作为以上方法的参考与对比
P1=imnoise(image,'gaussian',0.01); %方差为0.01,均值为0
subplot(1,4,4);
imshow(P1);
title('自带函数加高斯噪声后');

得到的效果,用了最为经典的Lena图:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Wadewhl/article/details/112236806