소스 뷰어
import numpy as np, cv2
def draw_ellipse(image, roi, ratio, color, thickness=cv2.FILLED):
x, y, w, h = roi
center = (x + w // 2, y + h // 2) # 타원 중심
size = (int(w * ratio), int(h * ratio)) # 타원 크기
cv2.ellipse(image, center, size, 0, 0, 360, color, thickness)
return image
def make_masks(rois, correct_shape): # 영역별 마스크 생성
base_mask = np.full(correct_shape, 255, np.uint8)
hair_mask = draw_ellipse(base_mask, rois[3], 0.45, 0, -1)
lip_mask = draw_ellipse(np.copy(base_mask), rois[2], 0.45, 255)
masks = [hair_mask, hair_mask, lip_mask, ~lip_mask]
masks = [mask[y:y+h,x:x+w] for mask,(x,y, w,h) in zip(masks, rois)]
# for i, mask in enumerate(masks):
# cv2.imshow('mask'+str(i), mask)
# cv2.waitKey()
return masks
def calc_histo(image, rois, masks):
bsize = (64, 64,64) # 히스토그램 계급 개수
ranges = (0,256, 0,256, 0,256) # 각 채널 빈도 범위
subs = [image[y:y+h, x:x+w] for x, y, w, h in rois]
hists = [cv2.calcHist([sub], [0,1,2], mask, bsize, ranges) for sub, mask in zip(subs, masks)]
hists = [ h/np.sum(h) for h in hists] # 정규화
sim1 = cv2.compareHist(hists[2], hists[3], cv2.HISTCMP_CORREL)
sim2 = cv2.compareHist(hists[0], hists[1], cv2.HISTCMP_CORREL)
return sim1, sim2