[OpenCV] 블러링 – 가우시안 필터

이번 글에서는 가우시안 필터(Gaussian filter)에 대해 알아보겠습니다.

가우시안 필터는 확률론과 통계학에서 가우시안 분포에 대하여, 함수를 근사하여 생성한 필터 마스크를 사용하는 기법입니다.
가우시안 분포는 보통 아래와 같이 좌우대칭의 종모양을 가지며, 자연계에서 발생하는 대부분 사건은 가우시안 분포를 따르는 것으로 알려져 있습니다.

가우시안 분포 함수식은 아래와 같습니다. σ(sigma)는 표준편차이며, μ(mu)는 평균을 나타내며, 가우시안 필터는 평균(μ)이 0인 가우시안 분포 함수를 사용합니다.

표준편차(σ)가 크면 그래프가 넓게 퍼지고, 표준편차가 작으면 그래프가 뾰족한 모양이 됩니다.
OpenCV 에서 가우시안 필터링을 하기 위해 GaussianBlur 함수를 사용합니다.

/**
@param src 입력 영상
@param dst 출력 영상, 입력과 같은 크기, 타입
@param ksize 가우시안 커널 크기. 
@param sigmaX X방향의 가우시안 커널 표준편차
@param sigmaY Y방향의 가우시안 커널 표준편차. 0이면 sigmaX와 같은 값
@param borderType 가장자리 방식
 */
CV_EXPORTS_W void GaussianBlur( InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY = 0, int borderType = BORDER_DEFAULT );

샘플 코드는 아래와 같습니다.

Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE);
if (src.empty())
{
	cerr << "image open error" << endl;
	return;
}

const int MAX_SIGMA = 5;
Mat dst[MAX_SIGMA];
for (int iSigma = 1 ; iSigma < MAX_SIGMA ; iSigma++)
	GaussianBlur(src, dst[iSigma], Size(), (double)iSigma);

imshow("src", src);
for (int iSigma = 1 ; iSigma < MAX_SIGMA ; iSigma++)
{
	String str = format("dst = %d", iSigma);

	putText(dst[iSigma], str, Point(10, 50), FONT_HERSHEY_SIMPLEX, 1.0, Scalar(255));
	imshow(str, dst[iSigma]);
}

waitKey();
destroyAllWindows();

실행 결과는 아래와 같습니다.