더북(TheBook)

그러면 실제로 영상에 가우시안 잡음을 추가하는 함수를 작성해보자. 함수의 이름은 IppNoiseGaussian을 사용하기로 하고, IppFilter.h 파일에 다음과 같이 함수 선언을 추가하자.

void IppNoiseGaussian(IppByteImage& imgSrc, IppByteImage& imgDst, int amount);

IppNoiseGaussian 함수는 입력 영상 imgSrc에 대해 amount만큼의 가우시안 임의 잡음을 추가하고, 그 결과를 imgDst에 저장한다. amount 인자에는 0부터 100 사이의 정숫값을 전달하면 되며, 각 픽셀마다 추가되는 잡음의 크기를 결정하게 된다. IppNoiseGaussian 함수의 전체 구현은 소스 8-12에 나타내었다.

소스 8-12 가우시안 임의 잡음 생성 함수(IppFilter.cpp)
#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)이다. 잡음의 양이 많아질수록 원본 영상의 디테일이 사라지면서 책에 쓰여 있는 글씨도 읽기 어려워지는 것을 확인할 수 있다.

그림 8-24 가우시안 잡음 추가
(a) 입력 영상
(b) amount = 5
(c) amount = 20
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.