더북(TheBook)

10.2.3 히스토그램 역투영

앞 절에서는 HSV 색 공간에서 inRange() 함수를 이용하여 사용자가 지정한 색상 영역을 검출하는 방법을 소개했습니다. HSV 색 공간에서 H 값을 이용하면 간단하게 특정 색상을 골라낼 수 있어서 편리합니다. 다만 이러한 방식은 보통 빨간색, 노란색, 녹색, 파란색처럼 원색에 가까운 색상을 찾기에는 효과적이지만 사람의 피부색처럼 미세한 변화가 있거나 색상 값을 수치적으로 지정하기 어려운 경우에는 적합하지 않습니다.

만약 입력 영상에서 찾고자 하는 객체의 기준 영상을 미리 가지고 있다면 컬러 히스토그램 정보를 이용하여 비슷한 색상 영역을 찾을 수 있습니다. 즉, 기준 영상으로부터 찾고자 하는 객체의 컬러 히스토그램을 미리 구하고, 주어진 입력 영상에서 해당 히스토그램에 부합하는 영역을 찾아내는 방식입니다. 이처럼 주어진 히스토그램 모델과 일치하는 픽셀을 찾아내는 기법을 히스토그램 역투영(histogram backprojection)이라고 합니다. 예를 들어 피부색에 대한 색상 히스토그램을 가지고 있다면 역투영 방법을 사용하여 영상에서 피부색 영역을 검출할 수 있습니다.

OpenCV에서 히스토그램 역투영은 calcBackProject() 함수를 이용하여 수행할 수 있습니다. calcBackProject() 함수 원형은 다음과 같습니다.

void calcBackProject(const Mat* images, int nimages,
     const int* channels, InputArray hist,
     OutputArray backProject, const float** ranges,
     double scale = 1, bool uniform = true);

images

입력 영상의 배열 또는 입력 영상의 주소. 영상의 배열인 경우, 모든 영상의 크기와 깊이는 같아야 합니다.

nimages

입력 영상 개수

channels

역투영 계산 시 사용할 채널 번호 배열

hist

입력 히스토그램

backProject

출력 히스토그램 역투영 영상. 입력 영상과 같은 크기, 같은 깊이를 갖는 1채널 행렬입니다.

ranges

각 차원의 히스토그램 빈 범위를 나타내는 배열의 배열

scale

히스토그램 역투영 값에 추가적으로 곱할 값

uniform

히스토그램 빈의 간격이 균등한지를 나타내는 플래그

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.