언샤프 마스크 필터

언샤프 마스크 필터는 영상을 선명하게 만드는 방법 중 하나다. 하지만 이름만 보면 선명하지 않게 만드는 느낌이 든다. 언샤프라는 명칭이 붙은 이유는 영상을 선명하게 만들 때 블러효과가 적용된 부드러운 영상을 사용하기 때문이다. 

위의 그래프들을 살펴보자. 첫번째 그래프는 일반적인 영상에서 특정 픽셀에 따른 값의 분포를 보여주고 있다. 원본 영상에 블러를 적용하면 두번째 그래프와 같이 나타난다. 첫번째 그래프보다 값의 변화가 완만해지고 부드럽게 보이는 효과가 있다. 원본 영상에서 블러가 적용된 영상을 차이를 구하면 세번째 그림과 같다. 부드러운 영상을 만들기 위해 적용했던 값들을 얻게 되는 것이다. 이 값들을 원본영상에 다시 더하면 이미지의 엣지 구간이 선명해지는 효과가 난다. 

즉, 부드럽게 만드는 작업을 역으로 적용하여 선명하게 만드는 것이다. 그래서 언샤프 마스크 필터다.

OpenCV에서는 언샤프 마스크 필터에 대한 함수를 따로 제공하고 있지는 않다. 그렇기 때문에 가우시안 필터를 활용하여 역으로 언샤프 마스크 필터를 적용하는 예제를 살펴보자.

private val kernelSize = 5.0
override fun process(src: Mat): Mat {
    val blurredSrc = Mat()
    Imgproc.GaussianBlur(src, blurredSrc, Size(0.0, 0.0), kernelSize)
    val dst = Mat()
    Core.addWeighted(src, 1.5, blurredSrc, -0.5, 0.0, dst)
    return dst
}

위의 예제에서는 가우시안 블러를 적용한 영상을 역으로 원본에 적용할 때 addWeight라는 함수를 사용하고, 블러를 적용한 영상에 대한 가중치를 음수로 적용했다. 

원본 영상

선명해진 영상

만약 컬러 영상을 선명하게 만들고 싶다면, 색상의 모든 채널에 이와 같은 작업을 하면 안된다. 색상 정보를 변경하기 때문이다. 그러므로 원본영상의 색공간을 YCbCr로 변경하고 밝기 성분에 해당하는 Y값에 대해서만 위와 같은 작업을 진행한 뒤 다시 채널들을 합성하면 원하는 결과값을 얻을 수 있을 것이다.

카테고리: OpenCV

0개의 댓글

답글 남기기

Avatar placeholder

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