본문 바로가기

IT

OpenCV에서 히스토그램 역투영 기법 사용하기

히스토그램 역투영(Back Projection) 기법을 활용한 객체 검출 기법은

특정 색상 분포를 가진 물체를 찾는 데 효과적인 방법으로,

특히 사람 피부색 추적, 물체 추적, 영상 세분화 등에 활용돼요.

 

OpenCV에서 히스토그램 역투영 기법 사용하기

 

이미지의 픽셀 분포를 분석해서 비슷한 색상의 영역을 강조하는 방식이기 때문에, 색상 기반 검출에서 매우 유용합니다.

히스토그램 역투영이란?

히스토그램 역투영(Back Projection)은 기준이 되는 색상의 히스토그램을 먼저 학습하고,

이를 기반으로 전체 이미지에서 유사한 색상 분포를 가진 영역을 찾아내는 기법이에요.

쉽게 말해 “이 색깔이 어디에 퍼져 있는지”를 시각적으로 나타내주는 방법이죠.

 

특히 색상이 뚜렷한 물체나 피부, 배경과 구분되는 색상을 가진 객체를 찾는 데 효과적이에요.

OpenCV에서는 calcHist()로 히스토그램을 만들고, calcBackProject()로 역투영을 수행할 수 있어요.

 

HSV 컬러 공간을 활용하면 밝기나 조명 변화에 덜 민감해 더 안정적인 결과를 얻을 수 있어요.

 

히스토그램 생성 예제

cv::Mat sample = cv::imread("hand.jpg");
cv::Mat hsvSample;
cv::cvtColor(sample, hsvSample, cv::COLOR_BGR2HSV);

int hBins = 30; int histSize[] = { hBins };
float hRanges[] = { 0, 180 };
const float* ranges[] = { hRanges };
int channels[] = { 0 }; // H 채널만

cv::Mat hist;
cv::calcHist(&hsvSample, 1, channels, cv::Mat(), hist, 1, histSize, ranges);
cv::normalize(hist, hist, 0, 255, cv::NORM_MINMAX);

 

위 코드는 입력 이미지에서 H(색상) 채널에 대한 히스토그램을 생성하고 정규화까지 수행해요.

이후 이 정보를 바탕으로 역투영을 할 수 있어요.

 

역투영 수행 예제

cv::Mat target = cv::imread("scene.jpg");
cv::Mat hsvTarget;
cv::cvtColor(target, hsvTarget, cv::COLOR_BGR2HSV);

cv::Mat backProj;
cv::calcBackProject(&hsvTarget, 1, channels, hist, backProj, ranges, 1.0);
cv::imshow("BackProjection", backProj);
cv::waitKey(0);

 

이 코드는 scene.jpg 이미지에서 이전에 만든 히스토그램을 기반으로

색상이 유사한 부분만 밝게 강조해줘요.

 

결과는 흑백 이미지처럼 보이지만,

흰 부분이 우리가 찾고자 하는 색상 분포를 갖고 있는 영역이에요.

 

마스크 처리 및 결과 개선

역투영 결과는 밝은 영역일수록 유사도가 높다는 의미예요.

하지만 역투영만으로는 경계가 명확하지 않기 때문에, 후처리가 필요해요.

 

일반적으로 threshold()로 이진 마스크를 만들고,

bitwise_and()로 원본 이미지와 합쳐서 색상이 일치하는 부분만 추출해요.

 

또는, 역투영 결과를 cv::CamShift()나 meanShift() 알고리즘과 결합해

동적인 물체 추적으로 확장할 수도 있어요.

 

노이즈 제거를 위해 morphologyEx()로 열림/닫힘 연산을 적용하는 것도 좋은 방법이에요.

실전 활용과 주의점

히스토그램 역투영은 조명에 민감하지 않고 빠르게 처리되므로,

실시간 카메라 입력에서도 잘 작동해요.

 

하지만 색상이 비슷한 배경이 있으면 오탐지 확률이 높아져요.

따라서 H뿐만 아니라 S(채도) 채널도 함께 사용해서 2D 히스토그램을 구성하면 더 정확한 탐지가 가능해요.

 

예를 들어 피부색을 추적할 때도 H만 사용할 경우 붉은 배경에 오인식이 생길 수 있지만,

H-S 히스토그램으로 대응하면 훨씬 안정적이에요.

 

또한 입력 이미지가 흐릿하거나 압축률이 높을 경우,

색상 정보 왜곡으로 인해 정확도가 떨어질 수 있어요.

 

이 블로그의 내용을 대화 형식인 음성으로 들으면서 정리하면, 보다 쉽게 이해할 수 있을 거예요.
다운받아 들어보세요~

OpenCV에서 히스토그램 역투영 기법 사용하기.mp3
3.90MB