Python/파이썬 OpenCV 공부

[파이썬 OpenCV] 히스토그램 역투영을 이용한 살색 영역 검출하기 - cv2.calcBackProject, cv2.calcHist

AI 꿈나무 2020. 9. 29. 14:52
반응형

황선규 박사님의 <OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝>을 공부한 내용을 정리했습니다.

 


히스토그램 역투영을 이용한 살색 영역 검출하기

 히스토그램 역투영 하는 방법은 <[파이썬 OpenCV] 히스토그램 역투영 - cv2.calcBackProject, cv2.selectROI>에서 확인할 수 있습니다.

 

 히스토그램 역투영을 이용해서 살색 영역을 검출해 보겠습니다.

 

1. 기존 영상으로부터 살색에 대한 컬러 히스토그램을 미리 계산하기

 마스크 영상은 포토샵으로 제작할 수 있습니다.

 

# CrCb 살색 히스토그램 구하기
ref = cv2.imread('kids1.png', cv2.IMREAD_COLOR)
mask = cv2.imread('kids1_mask.bmp', cv2.IMREAD_GRAYSCALE)

if ref is None or mask is None:
    print('Image load failed!')
    sys.exit()
    
    
# BGR -> YCrCb 전환
ref_yrcb = cv2.cvtColor(ref, cv2.COLOR_BGR2YCrCb)


# 히스토그램 생성
channels = [1,2]  # Cr Cb 속성만 이용
ranges = [0, 256, 0, 256]  # Cr, Cb 범위 지정
hist = cv2.calcHist([ref_ycrcb], channels, mask, [128, 128], ranges)  # 히스토그램 생성
hist_norm = cv2.normalize(cv2.log(hist + 1), None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8U)

 살색에 대한 컬러 히스토그램을 생성했습니다.

 

 

2. 입력 영상에서 미리 구한 살색 히스토그램에 부합하는 픽셀을 선별

 이제 입력 영상에 히스토그램 역투영을 적용하겠습니다.

 

# 입력 영상에 히스토그램 역투영 적용하기
src = cv2.imread('kids2.png', cv2.IMREAD_COLOR)

if src is None:
    print('Image load failed')
    sys.exit()
    

# 히스토그램 역투영을 위한 BGR -> YCrCb 전환
src_ycrcb = cv2.cvtColor(src, cv2.COLOR_BGR2YCrCb)


# 히스토그램 역투영
backproj = cv2.calcBackProject([src_ycrcb], channels, hist, ranges, 1)

cv2.imshow('src', src)
cv2.imshow('hist_norm', hist_norm)
cv2.imshow('backproj', backproj)
cv2.waitKey()
cv2.destroyAllWindows()

입력 영상
히스토그램 역투영

 살색 히스토그램을 구해서 입력 영상에 히스토그램 역투영을 했습니다.

 

반응형