目錄
1.圖像噪聲介紹
2.椒鹽噪聲的產(chǎn)生
3.高斯噪聲的產(chǎn)生
1.圖像噪聲介紹
噪聲介紹
? ? ?圖像噪聲是指在圖像中存在的不期望的、隨機(jī)的像素值變化,這些變化來源于多種因素。噪聲可能導(dǎo)致圖像細(xì)節(jié)模糊、失真或難以分辨。
以下是幾種常見的圖像噪聲類型:
? ? ? 1.椒鹽噪聲:又被稱作脈沖噪聲,它會隨機(jī)改變圖像中的像素值,是由相機(jī)成像、圖像傳輸、解碼處理等過程產(chǎn)生的黑白相間的亮暗點(diǎn)噪聲。
? ? ?2. 高斯噪聲:高斯噪聲是指噪聲分布的概率密度函數(shù)服從高斯分布(正態(tài)分布)的一類噪聲。
2.椒鹽噪聲的產(chǎn)生
椒鹽噪聲生成的步驟:
- Step1:確定添加椒鹽噪聲的位置。
- Step2:確定噪聲的種類。
- Step3:修改圖像像素灰度值。
- Step4:得到含有椒鹽噪聲的圖像。
?由于椒鹽噪聲是隨機(jī)產(chǎn)生的,所以我們要使用opencv中能夠產(chǎn)生 隨機(jī)數(shù)的函數(shù),有下面兩個:
1.rand_double()
double cvflann::rand_double ( double high=1.0,
double low = 0
)
2.rand_int()
int cvflann::rand_int ( int high =RAND MAX,
int low = 0
)
由于圖像像素中的數(shù)據(jù)都是整數(shù),并且產(chǎn)生的椒鹽噪聲的數(shù)據(jù)是0或者255的整數(shù),我們主要使用rand_int()這個函數(shù)。
? ? ? ?在OpenCV中,可以使用cv::Mat
類和隨機(jī)數(shù)生成函數(shù)rand_int()來模擬生成椒鹽噪聲。下面是一個示例代碼,展示如何在圖像中添加椒鹽噪聲:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
//圖像添加椒鹽噪聲函數(shù)
void saltAndPepper(Mat image,int n){
for(int k=0;k<n/2;k++){
//隨機(jī)確定圖像中的位置
int i,j;
i=cvflann::rand_int()%image.cols;//取余數(shù)運(yùn)算,保證在圖像的列數(shù)內(nèi)
j=cvflann::rand_int()%image.rows;//取余數(shù)運(yùn)算,保證在圖像的行數(shù)內(nèi)
int write_black=rand()%2;//判斷為白色噪聲還是黑色噪聲的變量
if(write_black==0)//添加白色噪聲
{
if(image.type()==CV_8UC1){
image.at<uchar>(j,i)=255;//白色噪聲
}
else if(image.type()==CV_8UC4)//處理彩色圖片
{
image.at<Vec4b>(j,i)[0]=255;//Vec4b為opencv定義的一個3個值的向量類型,指定通道,B:0 G:1 R:2
image.at<Vec4b>(j,i)[1]=255;
image.at<Vec4b>(j,i)[2]=255;
image.at<Vec4b>(j,i)[3]=255;
}
}else{//添加黑色噪聲
if(image.type()==CV_8UC1){
image.at<uchar>(j,i)=0;//白色噪聲
}
else if(image.type()==CV_8UC4)//處理彩色圖片
{
image.at<Vec4b>(j,i)[0]=0;//Vec4b為opencv定義的一個3個值的向量類型,指定通道,B:0 G:1 R:2
image.at<Vec4b>(j,i)[1]=0;
image.at<Vec4b>(j,i)[2]=0;
image.at<Vec4b>(j,i)[3]=0;
}
}
}
}
//椒鹽噪聲
void Saltandpepper_noise(Mat image){
Mat gray;
cvtColor(image,gray,COLOR_BGR2GRAY);
imwrite("/sdcard/DCIM/image.png",image);//展示原圖
imwrite("/sdcard/DCIM/gray.png",gray);
saltAndPepper(image,10000);//彩色圖像添加椒鹽噪聲
saltAndPepper(gray,10000);//灰度圖像添加椒鹽噪聲
imwrite("/sdcard/DCIM/image_saltAndPepper.png",image);
imwrite("/sdcard/DCIM/gray_saltAndPepper.png",gray);
}
在上面的代碼中,首先包含了OpenCV的頭文件<opencv2/opencv.hpp>
。然后,定義了一個名為SaltAndPepper()
的函數(shù),用于向圖像中添加椒鹽噪聲。
該函數(shù)使用cvflann::rand_int()
函數(shù)生成隨機(jī)數(shù),并根據(jù)給定的噪聲比例計算添加噪聲的像素數(shù)量。接著,在圖像中隨機(jī)選擇這些像素,并將其值設(shè)置為黑色(0)或白色(255),從而模擬生成椒鹽噪聲。
在Saltandpepper_noise函數(shù)中,讀取了原始圖像,并調(diào)用SaltAndPepper()
函數(shù)來添加椒鹽噪聲。然后,使用cv::imwrite()
顯示帶有噪聲的圖像。
? ? ? ?
? ? ? ? ?灰度圖像? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?灰度圖像添加椒鹽噪聲
? ??
? ? ? ? ? ? 彩色圖像? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?彩色圖像添加椒鹽噪聲
請注意,在示例代碼中,假設(shè)待處理的圖像是8位無符號整型單通道灰度圖像(CV_8UC1
)或4通道彩色圖像(CV_8UC4
)。如果處理的圖像類型不同,需要相應(yīng)地修改代碼。
3.高斯噪聲的產(chǎn)生
高斯噪聲生成的步驟:
Step1:創(chuàng)建一個與圖像尺寸、數(shù)據(jù)類型以及通道數(shù)相同的Mat類變量。
Step2:在Mat類變量中產(chǎn)生符合高斯分布的隨機(jī)數(shù)。
Step3:將原圖像和含有高斯分布的隨機(jī)數(shù)矩陣相加。
Step4:得到添加高斯噪聲的圖像。
在OpenCV中,RNG::fill()
是一個用于填充數(shù)組或矩陣的函數(shù),它可以生成指定分布的隨機(jī)數(shù),并將其存儲在指定的數(shù)據(jù)結(jié)構(gòu)中。該函數(shù)的簽名如下:
void cv::RNG::fill ( InputOutputArray mat,
int? ? ?distType,
InputArray? ?a,
InputArray? ? ?b,
bool? ? ?saturateRange = false
)
- mat:用于存放隨機(jī)數(shù)的矩陣,目前只支持低于5通道的矩陣。
-
distType
:指定生成隨機(jī)數(shù)分布的類型,可以是以下值之一:-
RNG::UNIFORM
:均勻分布 -
RNG::NORMAL
:正態(tài)分布(高斯分布)
-
-
a
:生成分布所需的參數(shù)之一。對于均勻分布,它表示隨機(jī)數(shù)的下界;對于正態(tài)分布,它是均值。 -
b
:生成分布所需的參數(shù)之二。對于均勻分布,它表示隨機(jī)數(shù)的上界;對于正態(tài)分布,它是標(biāo)準(zhǔn)差。 -
saturateRange
:一個可選的布爾值,如果為true,則將生成的隨機(jī)數(shù)截斷到輸出數(shù)組或矩陣的數(shù)據(jù)類型的有效范圍內(nèi)。
在OpenCV中,可以使用隨機(jī)數(shù)生成函數(shù)和高斯分布函數(shù)來模擬生成高斯噪聲。下面是一個示例代碼,展示如何在圖像中添加高斯噪聲:
//高斯噪聲
void Gaussian_noise(Mat image){
Mat gray;
cvtColor(image,gray,COLOR_BGR2GRAY);
Mat image_noise=Mat::zeros(image.rows,image.cols,image.type());
Mat gray_noise=Mat::zeros(gray.rows,gray.cols,gray.type());
imwrite("/sdcard/DCIM/image.png",image);//展示原圖
imwrite("/sdcard/DCIM/gray.png",gray);
RNG rng;//創(chuàng)建一個RNG類
rng.fill(image_noise,RNG::NORMAL,10,20);//生成三通道的高斯分布隨機(jī)數(shù)
rng.fill(gray_noise,RNG::NORMAL,15,30);
imwrite("/sdcard/DCIM/image_noise.png",image_noise);//三通道的高斯噪聲
imwrite("/sdcard/DCIM/gray_noise.png",gray_noise);//單通道的高斯噪聲
image=image+image_noise;//在彩色圖像中添加高斯噪聲
gray=gray+gray_noise;//在灰度圖像中添加高斯噪聲
//顯示添加高斯噪聲后的圖像
imwrite("/sdcard/DCIM/image_Gaussian.png",image);
imwrite("/sdcard/DCIM/gray_Gaussian.png",gray);
}
這段示例代碼演示了如何生成高斯噪聲,并將其添加到彩色圖像和灰度圖像中。
首先,代碼使用cvtColor
函數(shù)將輸入的彩色圖像轉(zhuǎn)換為灰度圖像,并創(chuàng)建了gray
和image
變量來存儲結(jié)果。
接下來,代碼創(chuàng)建了兩個空白圖像:image_noise
和gray_noise
,它們與輸入圖像和灰度圖像具有相同的尺寸和類型。這些圖像將用于存儲生成的高斯噪聲。
然后,代碼利用RNG
類創(chuàng)建了一個隨機(jī)數(shù)生成器對象rng
。
通過調(diào)用rng.fill()
函數(shù),代碼將生成服從高斯分布的隨機(jī)數(shù)填充到image_noise
和gray_noise
中。第一個參數(shù)是要填充的圖像,第二個參數(shù)RNG::NORMAL
表示生成的隨機(jī)數(shù)應(yīng)符合正態(tài)分布。第三個和第四個參數(shù)分別表示高斯分布的均值和標(biāo)準(zhǔn)差,這里分別為10和20(對于image_noise
)以及15和30(對于gray_noise
)。這些值可以根據(jù)需要進(jìn)行調(diào)整。
之后,代碼使用imwrite
函數(shù)將原始圖像、灰度圖像、生成的高斯噪聲圖像保存到指定路徑,將結(jié)果可視化。
最后,代碼將高斯噪聲添加到輸入的彩色圖像和灰度圖像中,通過對應(yīng)的像素相加。結(jié)果圖像被保存并可視化。
? ? ??
? ? ? ? ? ?灰度圖像? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?灰度圖像添加高斯噪聲
? ? ? ?
文章來源:http://www.zghlxwxcb.cn/news/detail-707042.html
? ? ? 彩色圖像? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?彩色圖像添加高斯噪聲文章來源地址http://www.zghlxwxcb.cn/news/detail-707042.html
到了這里,關(guān)于OpenCV(二十一):椒鹽噪聲和高斯噪聲的產(chǎn)生的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!