首先看这两张效果图:
图像加上高斯噪声非常简单了,每个像素点叠加上高斯噪声即可。同理也可以叠加上其他的噪声。具体可以参考GIMP代码
算法原理:
1. 首先随机产生高斯噪声,可以是RGB同一个随机噪声,也可以是三通道不同的随机噪声。
2. 将随机噪声的值叠加到像素中,并判断是否越界。
该算法存在一个参数:
1. 噪声程度:越大则噪声越大,图像越脏
高斯噪声产生的代码是从The Science Of FractalImages一书中得来的,GIMP中也是采用类似代码:
/* * Return a Gaussian (aka normal) random variable. * * Adapted from ppmforge.c, which is part of PBMPLUS. * The algorithm comes from: * 'The Science Of Fractal Images'. Peitgen, H.-O., and Saupe, D. eds. * Springer Verlag, New York, 1988. */ static int gauss(int scale) { double sum; sum = (RANDOM() & 0x7FFF) + (RANDOM() & 0x7FFF) + (RANDOM() & 0x7FFF) + (RANDOM() & 0x7FFF); return (int) (scale * (sum * 5.28596089837e-5 - 3.46410161514)); }
算法代码:没有经过任何优化
int GenGauss(int nLevel) { double d = (rand() + rand() + rand() + rand()) * 5.28596089837e-5 - 3.46410161514 ; return (int)(nLevel * d * 127.0 / 100.0) ; } void GuassianNoisyRGB(unsigned char* pInput,unsigned char* pOutput,int width,int height,int nStride,int nLevel) { int bRandom = 0; int n1, n2, n3 ; int i,j; int temp,index; if(nLevel<0) nLevel = 0; if(nLevel > 100) nLevel = 100; if(pInput == NULL || pOutput == NULL) return; if(width <= 0 || height <= 0) return; srand ((unsigned int)time(0)) ; for (j=0;j<height;j++) { for (i=0;i<width;i++) { if (bRandom) { n1=GenGauss(nLevel); n2=GenGauss(nLevel); n3=GenGauss(nLevel); } else { n1=n2=n3=GenGauss(nLevel) ; } index = j*nStride+i*3; temp = pInput[index] + n1; if(temp<0) temp = 0; if(temp>255) temp = 255; pOutput[index] = temp; temp = pInput[index+1] + n2; if(temp<0) temp = 0; if(temp>255) temp = 255; pOutput[index+1] = temp; temp = pInput[index+2] + n3; if(temp<0) temp = 0; if(temp>255) temp = 255; pOutput[index+2] = temp; } } }