카툰 필터 및 스케치 필터

 카메라로 부터 입력받은 영상을 실시간으로 필터 처리하여 재미있는 기능을 구현해보자.

카툰 필터 

카툰필터는 원본 영상을 블러로 뭉게고, 한편으로는 원본영상의 외곽선을 검출한다. 선처리 된 두 영상을 합치면 만화같은 느낌의 영상을 얻을 수 있다. 이를 카툰필터라고 한다.

 

카툰필터를 적용할 때 원본영상의 사이즈를 줄여서 영상처리를 퍼포먼스를 가속화 하며, 동시에 시각적으로도 효과적인 결과를 얻을 수 있다 . Canny() 함수를 통해 엣지를 검출하고 이진화 된 영상에 대해 흰색과 검정색을 반전시켜 엣지를 검정색으로 나타낸다. 블러된 이미지와 엣지영상을 bitwise_and() 연산자로 합성하고 다시 원래 사이즈로 변경한다.

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

override fun process(src: Mat): Mat {
    val width = src.width()
    val height = src.height()
    // 이미지의 크기를 줄이면 효과적으로 뭉개고, 연산량을 빨리 하는 효과가 있음.
    val resizedSrc = Mat()
    Imgproc.resize(src, resizedSrc, Size(width / 8.0, height / 8.0))
    // 블러 적용
    val blur = Mat()
    Imgproc.bilateralFilter(resizedSrc, blur, -1, 20.0, 7.0)
    // 엣지 검출한 뒤, 이미지를 반전시킨다.
    val edge = Mat()
    Imgproc.Canny(resizedSrc, edge, 100.0, 150.0)
    Core.bitwise_not(edge, edge)
    Imgproc.cvtColor(edge, edge, Imgproc.COLOR_GRAY2BGR)
    //블러시킨 이미지와 반전된 edge를 and연산자로 합치면 edge부분은 검정색으로 나오고, 나머지는 많이 뭉개지고 블러처리된 이미지로 나옴, 카툰효과
    val dst = Mat()
    Core.bitwise_and(blur, edge, dst)
    Imgproc.resize(dst, dst, Size(width.toDouble(), height.toDouble()), 1.0, 1.0, Imgproc.INTER_NEAREST)
    return dst
}

그런데 이렇게 복잡하게 구현할 필요 없이 OpenCV에서는 stylization()이라는 함수를 제공하는데, 이를 이용하면 카툰필터 효과를 손쉽게 구현할 수 있다.

Photo.stylization(Mat src, Mat dst, float sigma_s, float sigma_r)
src : 입력영상
dst : 출력영상
sigma_s : 0~200의 값. 이미지가 얼마나 스무스해질지를 결정
sigma_r : 0~1의 값. 이미지가 스무스해지는 동안 엣지를 얼마만큼 보존시킬지를 결정

스케치 필터

스케치 필터는 원본영상을 연필로 스케치만 한 것 처럼 변경시켜주는 필터다. 영상에서 상대적으로 평탄한 영역은 흰색으로 나타내고, 엣지 근방에서는 어두운 영역을 검정색으로 밝은 영역은 흰색으로 설정한다.

원본 영상을 회색으로 변경하고 가우시안 필터를 적용한다. 회색이미지와 가우시안 블러를 적용한 이미지를 divide()함수를 통해 나눈 값에 255를 곱하면  엣지가 남는다.

안드로이드 예제코드를 살펴보면 다음과 같다.

override fun process(src: Mat): Mat {
    //회색조 이미지 만들기
    val gray = Mat()
    Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY)
    // 회색조 이미지를 블러시키기
    val blur = Mat()
    Imgproc.GaussianBlur(gray, blur, Size(0.0, 0.0), 3.0)
    // 엣지만 남고 평탄한 부분은 흰색으로 바뀜
    val dst = Mat()
    Core.divide(gray, blur, dst, 255.0)
    return dst
}

 

카테고리: OpenCV

2개의 댓글

안드초보 · 2021년 5월 4일 4:54 오후

영상은 어떻게 실시간으로 받아오셨나요?
카메라에서 Mat 을 받아오는 코드도 혹시 공유해주실 수 있을까요?

Charlezz 에 답글 남기기 응답 취소

Avatar placeholder

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