관심영역(ROI;Region Of Interest) 이란? 

관심 영역 (ROI)은 이미지 분석 위해 한 이미지 내에서 선택되어진 일부 영역을 말한다. 추가적인 이미지 처리가 필요할 때 이 영역에 집중할 수 있게 된다. 

일상생활에서 예시를 찾아보자. 코로나로 인해 QR코드 스캐너를 어디에서나 볼 수 있다. 실제 카메라에 들어오는 영상이라는 것은 연속되는 정지된 이미지다. 하나의 이미지는 여러개의 픽셀로 이루어져 있고 이 픽셀들을 모두 읽고 처리하는 것은 버거운 일이다. 그러므로 관심영역을 설정하여 이미지 분석을 할 수 있다. QR코드는 사각형이므로 이미지 분석을 하기 전에 사각형 오브젝트만 골라내어 분석하면 좀 더 빠른 연산을 기대할 수 있다. 여기서 사각형 오브젝트를 골라내는 작업이 바로 관심영역을 설정하는 부분이다.

마스크란?

마스크는 0과 0이 아닌 값으로 구성된 바이너리 이미지다. 즉 1~255는 같은 값으로 취급한다. 즉 마스크가 이이미지에 적용되는 경우 마스크 에서 0 인 모든 픽셀은 출력 이미지에서 0으로 설정된다. 다른 모든 항목은 변경되지 않는다. 마스킹은 픽셀에 대해 곱셈 또는 AND연산을 사용하여 구현할 수 있으며 일반적으로 후자가 더 빠르다.

OpenCV는 일부 함수에 대해서 ROI연산을 지원하는데 이때 반드시 마스크이미지를 인자로 함께 전달해야한다.

예) copyTo(), calcHist(), bitwise_or(), matchTemplate() 등

마스킹 예제 

// 레나 이미지 불러오기
val lennaMat = Utils.loadResource(requireContext(), R.drawable.lenna)
binding.lenna.setImageBitmap(bitmapUtil.bitmapFrom(lennaMat))

// 마스크 이미지는 CV8U 또는 CV8U_1C로 불러온다. 
// 0이 아닌 픽셀에 대해서만 연산 수행
val maskMat = Utils.loadResource(requireContext(), R.drawable.mask_circle, CvType.CV_8U)
binding.mask.setImageBitmap(bitmapUtil.bitmapFrom(maskMat))

// 마스킹 결과물을 담을 Mat 만들기
val dst = Mat(lennaMat.rows(), lennaMat.cols(), CvType.CV_8UC3)
Core.copyTo(lennaMat, dst, maskMat)
binding.maskedLenna.setImageBitmap(bitmapUtil.bitmapFrom(dst))

카테고리: OpenCV

0개의 댓글

답글 남기기

Avatar placeholder

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