圖像基本噪聲添加函數

以前學習圖像處理時,寫的函數代碼呀!

編程環境: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);
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章