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 |
히스토그램 빈의 간격이 균등한지를 나타내는 플래그 |