가우시안 필터

평균값 필터의 단점은 필터링 대상 픽셀과 인접 픽셀들이 모두 같은 가중치를 사용하여 평균치를 계산한다는 점이다. 이는 대상 픽셀보다 멀리 있는 픽셀들의 영향을 많이 받을 수 있다는 것을 의미한다. 아무래도 이미지에서 픽셀의 분포 특성상, 대상 픽셀에 가까이 인접해 있을수록 비슷하고 멀리 있을 수록 많이 달라지게 된다.

가우시안 필터는 가까운 픽셀에 큰가중치를 두고,  멀리 있는 픽셀에는 작은 가중치를 사용하여 평균값을 계산한다.

가우시안 함수는 지수 함수를 이용해 다음과 같이 정의할 수 있다.

여기서 

μ

는 가우스 함수의 중심(평균), 

σ(시그마)

는 낙타 혹 모양이 퍼진 정도(표준편차)를 나타낸다.

표준 정규 분포에서 시그마값이 +-3을 넘어가면 사실상 0에 수렴하게 되는 특징이 있다.

2차원 가우시안 함수의 방적식 및 가시화 된 모델은 다음과 같다.

중점계산을 위해 가우시안의 커널 크기는 양수이면서 홀수여야 한다. 또한 X 및 Y 방향의 sigmaX 및 sigamY의 표준 편차를 지정해야하는데, sigmaX만 지정된 경우 sigmaY는 simgaX와 동일하게 지정된다. 

필터의 마스크 크기가 시그마의 크기가 최대 9

 일 때의 가중치를 도식화하면 다음과 같다.

위에서 언급했듯이 시그마의 크기가 +-3이상 넘어가면 사실상 값이 가중치가 거의 희미해진다. 이러한 특징때문에 OpenCV에 구현된 가우시안 스무딩은 여러 공통 커널에 대해 더 높은 성능을 내도록 최적화 돼 있다. ‘표준’ 시그마를 갖는 3*3, 5*5, 7*7 커널은 다른 커널의 사용보다 성능이 좋다. 

OpenCV에서의 가우시안 블러 함수를 살펴보자.

GaussianBlur(Mat src, Mat dst, Size ksize, double sigmaX)
src : 입력영상
dst : 출력영상
ksize : 가우시안 커널 크기, (0,0)을 지정하면 sigma에 의해 자동 결정된다.
sigmaX : x방향 sigma, 지정하는 값으로 sigmaY값이 결정됨.

안드로이드에서의 예제코드는 다음과 같다.

private val kernelSize = 5.0
override fun process(src: Mat): Mat {
    val dst = Mat()
    //커널사이즈를 0,0으로 지정하면 sigmaX값에 의해 자동 결정됨.
    Imgproc.GaussianBlur(src, dst, Size(0.0, 0.0), kernelSize)
    return dst
}

원본

가우시안 필터가 적용된 이미지

평균값 필터보다 조금 더 자연스러운 블러 효과를 확인 할 수 있다.

Buy me a coffeeBuy me a coffee
카테고리: AndroidOpenCV

0개의 댓글

답글 남기기

Avatar placeholder

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.