그러면 실제로 영상에 가우시안 잡음을 추가하는 함수를 작성해보자. 함수의 이름은 IppNoiseGaussian을 사용하기로 하고, IppFilter.h 파일에 다음과 같이 함수 선언을 추가하자.
void IppNoiseGaussian(IppByteImage& imgSrc, IppByteImage& imgDst, int amount);
IppNoiseGaussian 함수는 입력 영상 imgSrc에 대해 amount만큼의 가우시안 임의 잡음을 추가하고, 그 결과를 imgDst에 저장한다. amount 인자에는 0부터 100 사이의 정숫값을 전달하면 되며, 각 픽셀마다 추가되는 잡음의 크기를 결정하게 된다. IppNoiseGaussian 함수의 전체 구현은 소스 8-12에 나타내었다.
#include <math.h> #include <time.h> #include <stdlib.h> #include <random> #include <algorithm> void IppNoiseGaussian(IppByteImage& imgSrc, IppByteImage& imgDst, int amount) { int size = imgSrc.GetSize(); imgDst = imgSrc; BYTE* pDst = imgDst.GetPixels(); unsigned int seed = static_cast<unsigned int>(time(NULL)); std::default_random_engine generator(seed); std::normal_distribution<double> distribution(0.0, 1.0); double rn; for (int i = 0; i < size; i++) { rn = distribution(generator) * 255 * amount / 100; pDst[i] = static_cast<BYTE>(limit(pDst[i] + rn)); } }
그림 8-24는 실제 영상에 가우시안 잡음을 추가한 예를 보여준다. 그림 8-24(a)는 입력 영상인 boolshelf.bmp 파일이다. 이 영상에 대해 amount = 5만큼의 가우시안 잡음을 추가한 결과가 그림 8-24(b)이고, amount = 20 만큼의 잡음을 추가한 결과가 그림 8-24(C)이다. 잡음의 양이 많아질수록 원본 영상의 디테일이 사라지면서 책에 쓰여 있는 글씨도 읽기 어려워지는 것을 확인할 수 있다.


