ImageNoise使用说明
本代码是利用图片叠加的原理消除噪声的实验代码
Github
原理
原理说明
图像的加法可用于平均以减少和去除图像采集中混入的噪声,在采集中实际图像的时候,由于各种不同的原因,常会有一些干扰或噪声混入到最后采集的图像中。从这个意义上来说,实际采集到的图像g_i (x,y可看做是由原始场景图像f(x,y)和噪声图像叠加而成的,即
g(x,y)=f(x,y)+ε(x,y)
图像的加法可用于平均以减少和去除图像采集中混入的噪声,在采集中实际图像的时候,由于各种不同的原因,常会有一些干扰或噪声混入到最后采集的图像中。从这个意义上来说,实际采集到的图像g_i (x,y可看做是由原始场景图像f(x,y)和噪声图像叠加而成的,即
g(x,y)=f(x,y)+ε(x,y)
那么可以证明新的图像的期望值为
E{¯g(x,y)}=f(x,y)
如果考虑新图像和噪声图像各自的均方差的关系,则
σ(¯g(x,y))=√(1/M)×σ(e(x,y))
可见随着平均图像数量M的增加,噪声在每个像素的位置(x,y)的影响越来越小
#include <cstdlib>
#include <cmath>
#include <limits>
double generateGaussianNoise(double mu, double sigma)
{
const double epsilon = std::numeric_limits<double>::min();
const double two_pi = 2.0*3.14159265358979323846;
static double z0, z1;
static bool generate;
generate = !generate;
if (!generate)
return z1 * sigma + mu;
double u1, u2;
do
{
u1 = rand() * (1.0 / RAND_MAX);
u2 = rand() * (1.0 / RAND_MAX);
}
while ( u1 <= epsilon );
z0 = sqrt(-2.0 * log(u1)) * cos(two_pi * u2);
z1 = sqrt(-2.0 * log(u1)) * sin(two_pi * u2);
return z0 * sigma + mu;
}
使用说明
下载源码
命令行切换到打开build目录
-
输入
ImageNoise.exe image.jpg 40
(第二个参数为图片名称,第三个参数为加噪图片数量)
-
目录下会生成一个output40.jpg的文件即为输出文件
原始图片
加噪图片
结果图片