1、椒盐噪声
1.1、概念
椒盐噪声由图像传感器,传输通道,解码处理等产生的黑白相间的亮暗点噪声。椒盐噪声的出现点是随机的,噪声的数值是固定的,要么是 0 (黑色),要么是 255 (白色)。
椒盐噪声是指2种噪声:
- 盐噪声(salt noise 盐=白色255),高灰度噪声
- 胡椒噪声(pepper noise 椒=黑色0),低灰度噪声
1.2、添加椒盐噪声
//盐噪声
void salt(cv::Mat image, int n/*噪点个数*/) {
int i,j;
for (int k=0; k<n/2; k++) {
// rand() is the random number generator
i = std::rand()%image.cols; // % 整除取余数运算符,rand=1022,cols=1000,rand%cols=22
j = std::rand()%image.rows;
if (image.type() == CV_8UC1) { // gray-level image
image.at<uchar>(j,i)= 255; //at方法需要指定Mat变量返回值类型,如uchar等
} else if (image.type() == CV_8UC3) { // color image
image.at<cv::Vec3b>(j,i)[0]= 255; //cv::Vec3b为opencv定义的一个3个值的向量类型
image.at<cv::Vec3b>(j,i)[1]= 255; //[]指定通道,B:0,G:1,R:2
image.at<cv::Vec3b>(j,i)[2]= 255;
}
}
}
//椒噪声
void pepper(cv::Mat image, int n/*噪点个数*/) {
int i,j;
for (int k=0; k<n; k++) {
// rand() is the random number generator
i = std::rand()%image.cols; // % 整除取余数运算符,rand=1022,cols=1000,rand%cols=22
j = std::rand()%image.rows;
if (image.type() == CV_8UC1) { // gray-level image
image.at<uchar>(j,i)= 0; //at方法需要指定Mat变量返回值类型,如uchar等
} else if (image.type() == CV_8UC3) { // color image
image.at<cv::Vec3b>(j,i)[0]= 0; //cv::Vec3b为opencv定义的一个3个值的向量类型
image.at<cv::Vec3b>(j,i)[1]= 0; //[]指定通道,B:0,G:1,R:2
image.at<cv::Vec3b>(j,i)[2]= 0;
}
}
}
2、高斯噪声
2.1、概念
高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。常见的高斯噪声包括起伏噪声、宇宙噪声、热噪声和散粒噪声等。对高斯噪声的抑制方法常常采用数理统计方法。高斯噪声出现在图像的每一个点上,而值的大小却是随机的。
产生原因为:
- 图像传感器在拍摄时市场不够明亮、亮度不够均匀
- 电路各元器件自身噪声和相互影响
- 图像传感器长期工作,温度过高
2.2、添加高斯噪声函数
//------------【为图像添加高斯噪声】----------------
Mat addGuassianNoise(Mat& srcImage)
{
Mat resultImage = srcImage.clone(); // 克隆一副与源图像尺寸类型一样的图像
int channels = resultImage.channels();//获取图像的通道
int nRows = resultImage.rows; //图像的行数
int nCols = resultImage.cols*channels;//图像的总列数
//判断图像的连续性
if (resultImage.isContinuous()) //判断矩阵是否连续,若连续,我们相当于只需要遍历一个一维数组
{
nCols *= nRows;
nRows = 1;
}
//遍历图像中的像素
for (int i = 0; i < nRows; ++i)
{
for (int j = 0; j < nCols; ++j)
{
//添加高斯噪声
int val = resultImage.ptr<uchar>(i)[j] + generateGaussianNoise(2, 0.8) * 32;
if (val < 0)
val = 0;
if (val > 255)
val = 255;
resultImage.ptr<uchar>(i)[j] = (uchar)val;
}
}
return resultImage;
}
//-------------【生成高斯噪声】---------
double generateGaussianNoise(double mu, double sigma)
{
//定义一个特别小的值
const double epsilon = std::numeric_limits<double>::min();//返回目标数据类型能表示的最逼近1的正数和1的差的绝对值
static double z0, z1;
static bool flag = false;
flag = !flag;
//flag为假,构造高斯随机变量X
if (!flag)
{
return z1*sigma + mu;
}
double u1, u2;
//构造随机变量
do
{
u1 = rand()*(1.0 / RAND_MAX);
u2 = rand()*(1.0 / RAND_MAX);
} while (u1 <= epsilon);
//flag为真,构造高斯随机变量X
z0 = sqrt(-2.0*log(u1))*cos(2 * CV_PI*u2);
z1 = sqrt(-2.0*log(u1))*sin(2 * CV_PI*u2);
return z0*sigma + mu;
}
3、泊松噪声
3.1、概念
何为泊松噪声,就是符合泊松分布的噪声模型,泊松分布适合于描述单位时间内随机事件发生的次数的概率分布。如某一服务设施在一定时间内受到的服务请求的次数,电话交换机接到呼叫的次数、汽车站台的候客人数、机器出现的故障数、自然灾害发生的次数、DNA序列的变异数、放射性原子核的衰变数等等。
4、乘性噪声
4.1、概念
乘性噪声一般由信道不理想引起,它们与信号的关系是相乘,信号在它在,信号不在他也就不在