양방향 필터 (Bilateral Filter)

평균값 필터 또는 가우시안 필터는 이미지의 엣지(윤곽선) 부근에서도 픽셀 값을 평탄하게 만드는 단점이 있다. 양방향 필터는 대상 픽셀과 주변 픽셀과의 거리 그리고 픽셀 값의 차이를 함께 고려하여, 엣지를 보전하는 블러 기법 중 하나다. 가우시안 필터보다 처리 시간이 더 오래 걸리지만, 더 나은 품질의 이미지를 만들어 낼 수도 있다.

가우시안 필터 적용 사례

양방향 필터 적용 사례

양방향 필터의 원리를 살펴보면, 가우시안 필터와 마찬가지로 대상 픽셀에 인접한 픽셀의 가중평균을 구한다. 다만 가우시안과의 차이점은 이 가중치를 구할 때 가우시안 필터보다 한가지 요소가 더 고려된다. 바로 대상 픽셀의 강도(픽셀값) 차이를 기반으로 한다. 양방향 필터는 고대비의 엣지를 선명하게 유지하고 더 비슷한 픽셀에 더 높게 가중치를 두는 가우시안 필터 방법으로 생각 할 수 있다. 

양방향필터를 수식으로 바꾸면 다음과 같다.

 

빨간색은 정규화 하기 위해 넣은 요소고, 주황색영역은 기존 그대로 가우시안 필터를 적용하는 방법이다. 파랑생 영역은 엣지를 보존하기 위해 대상 픽셀과 주변 픽셀의 차를 비교하여 대비를 구한 다음 가중치를 결정한다.

OpenCV에서 제공하는 양방향 필터 함수는 bilateralFilter로 다음과 같은 인자를 갖는다.

bilateralFilter(Mat src, Mat dst, int d, double sigmaColor, double sigmaSpace)
src : 입력영상
dst : 출력영상
d : 필터크기로 -1 또는 음수를 입력하면 sigmaSpace값에 의해 자동 결정된다. d가 크면 속도가 느려진다.
sigmaColor: 색 공간에서 필터의 표준 편차, 값이 클수록 블러에 포함될 색의 범위가 넓어짐.
sigamSpace : 좌표 공간에서 필터의 표준 편차, 가우시안 커널의 너비.

안드로이드 예제는 다음과 같다.

override fun process(src: Mat): Mat {
    val dst = Mat()
    Imgproc.bilateralFilter(
        src,
        dst,
        -1, // 필터링에 사용될 이웃 픽셀의 거리(지름). -1을 입력하면 sigmaSpace에 의해 자동 결정
        10.0, // 색 공간에서 필터의 표준 편차
        5.0 // 좌표 공간에서 필터의 표준 편차
    )
    return dst
}

원본

양방향 필터가 적용된 이미지

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

0개의 댓글

답글 남기기

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