以前學習圖像處理時,寫的函數代碼呀!
編程環境:windows下結合opencv庫。
enum NOISE_TYPE //圖像噪聲類型
{
//均勻噪聲,高斯噪聲,椒鹽噪聲
NOISE_UNIFORM, NOISE_GAUSSIAN, NOISE_SALT
};
//圖像添加噪聲 參數A B在不同噪聲類型時含義不同 源圖像爲8位
//1.參數範圍爲 0 - 255
//2.均勻噪聲時,參數A爲下界,參數B爲上界
//3.高斯噪聲時,參數A爲高斯均值,參數B爲高斯標準差
//4.椒鹽噪聲時,參數A爲鹽噪聲比例,參數B爲椒噪聲比例,且0<A+B<100
void AddNoise(IplImage* src, IplImage* dst, NOISE_TYPE noiseType, float fParamA, float fParamB);
//圖像添加噪聲
void AddNoise(IplImage* src, IplImage* dst, NOISE_TYPE noiseType, float fParamA, float fParamB)
{
if (!src || !dst)
{
return;
}
if (src->nChannels == 3)
{
cvCvtColor(src, dst, CV_BGR2GRAY);
}
CvRNG rng = cvRNG();//初始化隨機數生成器
CvMat* pMatNoise = cvCreateMat(src->height, src->width, CV_8UC1);//噪聲矩陣
switch (noiseType)
{
case NOISE_UNIFORM:
{
//產生圖像大小的均勻分佈隨機矩陣
cvRandArr(&rng, pMatNoise, CV_RAND_UNI, cvScalar(fParamA), cvScalar(fParamB));
//將均勻分佈隨機矩陣疊加到圖像中
cvAdd(src, pMatNoise, dst);
break;
}
case NOISE_GAUSSIAN:
{
//產生圖像大小的高斯分佈隨機矩陣
cvRandArr(&rng, pMatNoise, CV_RAND_NORMAL,
cvScalar(fParamA), cvScalar(fParamB));
//將高斯分佈隨機矩陣疊加到圖像中
cvAdd(src, pMatNoise, dst);
break;
}
case NOISE_SALT:
{
if (fParamA + fParamB >= 100)
{
cvReleaseMat(&pMatNoise);
return ;
}
//產生圖像大小的均勻分佈隨機矩陣
cvRandArr(&rng, pMatNoise, CV_RAND_UNI, cvScalar(0), cvScalar(255));
//圖像格式爲8位的整形,故最大爲255,最小爲0
//將隨機矩陣中小於a點在圖像中的設置像素值爲0
//將隨機矩陣中大於(255-b)點在圖像中的設置像素值爲255
for (int i = 0; i < pMatNoise->rows; i++)
{
uchar* pMat = (uchar*)(pMatNoise->data.ptr + i * pMatNoise->step);
uchar* pSrc = (uchar*)(src->imageData + i * src->widthStep);
uchar* pDst = (uchar*)(dst->imageData + i * dst->widthStep);
for(int j = 0; j < pMatNoise->cols; j++)
{
if (pMat[j] < fParamA / 100.0 * 255)
{
pDst[j] = 255;
}
else if (pMat[j] > (100 - fParamB) / 100.0 * 255)
{
pDst[j] = 0;
}
else
{
pDst[j] = pSrc[j];
}
}
}
break;
}
default:
{
}
}
cvReleaseMat(&pMatNoise);
}