안녕하세요! 오늘은 이미지 분석에서 특정 물체를 찾아내는 강력한 도구인 2차원 히스토그램과 역투영(Back Projection)에 대해 알아보겠습니다.
이미지 내에서 단순한 색상 분포를 넘어, 내가 원하는 대상의 색상 레시피를 찾아내고 이를 전체 영상에서 매칭하는 아주 유용한 기술입니다.
1. 2차원 히스토그램 (2D Histogram)
1차원 히스토그램이 각 픽셀값의 개수를 단순히 세는 것이라면, 2차원 히스토그램은 축이 2개이며 각 축이 만나는 지점의 개수를 표현합니다. 예를 들어 "Blue가 100이면서 Green이 50인 픽셀은 몇 개인가?"를 분석하는 식입니다.
결과는 1차원 그래프가 아닌 이미지 형태의 2차원 배열로 나타나며, 보통 색상 검출에 유리한 HSV 컬러 스페이스에서 H(색조)와 S(채도)를 두 축으로 설정하여 사용합니다.
📍 2D 히스토그램 예제 코드
import cv2
import matplotlib.pylab as plt
img = cv2.imread('mountain.jpg')
# Blue와 Green 채널에 대한 2D 히스토그램 계산
# [32, 32]는 빈(bin)의 개수, [0, 256, 0, 256]은 범위입니다.
hist = cv2.calcHist([img], [0, 1], None, [32, 32], [0, 256, 0, 256])
p = plt.imshow(hist)
plt.title('Blue and Green 2D Histogram')
plt.colorbar(p)
plt.show()
2. 역투영 (Back Projection)이란?
역투영은 "관심 영역(ROI)의 히스토그램과 유사한 분포를 갖는 영역을 찾아내는 기법"입니다. 이를 활용하면 이미지 내에서 특정 물체나 배경을 분리할 수 있습니다.
- 원리: 찾고자 하는 대상(예: 잔디)의 히스토그램을 먼저 구합니다. 그다음 전체 이미지의 각 픽셀이 해당 히스토그램 분포에 얼마나 포함되는지 비율을 구하여 픽셀값으로 매핑합니다.
- 결과: 기준색과 비슷할수록 흰색(255), 다를수록 검은색(0)에 가깝게 표현됩니다.
3. 실전 역투영 코드 예시
OpenCV에서 제공하는 cv2.calcBackProject() 함수를 사용하면 관심 영역의 히스토그램을 바탕으로 물체를 효율적으로 분리할 수 있습니다.
import cv2
import numpy as np
# 1. 이미지 로드 및 HSV 변환
img = cv2.imread('pump_horse.jpg')
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 2. 마우스로 관심 영역(ROI) 선택
x, y, w, h = cv2.selectROI('Select ROI', img, False)
if w > 0 and h > 0:
roi = hsv_img[y:y+h, x:x+w]
# 3. ROI의 H, S 채널 히스토그램 계산
hist_roi = cv2.calcHist([roi], [0, 1], None, [180, 256], [0, 180, 0, 256])
# 4. OpenCV API로 역투영 수행
# 입력 이미지, 채널, ROI 히스토그램, 범위, 배율 계수
bp = cv2.calcBackProject([hsv_img], [0, 1], hist_roi, [0, 180, 0, 256], 1)
# 5. 마스킹 처리 (이진화 후 원본과 합성)
_, mask = cv2.threshold(bp, 1, 255, cv2.THRESH_BINARY)
result = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow('Back Projection', result)
cv2.imshow('Original', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
🛠️ 핵심 요약 및 팁
- 색상 기반 분리: 역투영은 사물의 모양이 복잡해도 색상 특징만 뚜렷하다면 배경에서 효과적으로 분리해낼 수 있습니다.
- HSV 활용: BGR보다 색상 정보가 명확한 HSV 컬러 스페이스의 H, S 채널을 쓰는 것이 정확도가 훨씬 높습니다.
- 한계점: 기준색과 비슷한 색상의 배경이나 물체가 섞여 있으면 오작동할 수 있습니다. 이때는 모폴로지 연산 등을 통한 후처리가 필요합니다.
🚀 마치며
역투영은 알파 채널이나 크로마 키 배경이 없는 일반 영상에서도 특정 물체를 추적하거나 분리할 수 있는 아주 강력한 기법입니다. 데이터의 색상 레시피를 어떻게 활용하느냐에 따라 결과가 달라지니 다양한 환경에서 실습해 보시기 바랍니다.
궁금하신 점은 댓글로 남겨주세요! :)
반응형
'컴퓨터 과학 > 👀 컴퓨터 비전' 카테고리의 다른 글
| 📸 [OpenCV 기초] 이미지 이동, 확대/축소, 회전 완벽 정리 (0) | 2026.01.07 |
|---|---|
| 📸 [OpenCV 기초] 이미지 유사도 비교부터 모션 감지 CCTV까지 실습 완벽 정리 (0) | 2026.01.07 |
| 📊 [OpenCV 기초] 히스토그램과 화질 개선 (정규화, 평탄화, CLAHE) (0) | 2026.01.07 |
| 🖼️ [OpenCV 기초] 이미지 연산과 합성 (블렌딩, 마스킹) (0) | 2026.01.07 |
| 🌓 [OpenCV 기초] 스레시홀딩(Thresholding)과 오츠의 알고리즘 (0) | 2026.01.07 |