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、概念
乘性噪聲一般由信道不理想引起,它們與信號的關係是相乘,信號在它在,信號不在他也就不在