히스토그램 역투영 : 영상의 각 픽셀이 주어진 히스토그램 모델에 얼마나 일치하는지를 검사하는 방법
임의의 색상 영역 검출할 때 효과적
cv2.calcBackProject(images, channels, hist, ranges, scale [, dst]) [] : 생략 가능
import cv2
import numpy as np
src = cv2.imread('imgs/dog.jpg')
x, y, w, h = cv2.selectROI(src)
src_ycrcb = cv2.cvtColor(src, cv2.COLOR_BGR2YCrCb)
crop = src_ycrcb[y:y+h, x:x+w]
channels = [1, 2]
cr_bins = 128
cb_bins = 128
histSize = [cr_bins, cb_bins]
cr_range = [0, 256]
cb_range = [0, 256]
ranges = cr_range + cb_range
hist = cv2.calcHist([crop], channels, None, histSize, ranges)
hist_norm = cv2.normalize(hist, None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8U)
backproj = cv2.calcBackProject([src_ycrcb], channels, hist, ranges, 1)
dst = cv2.copyTo(src, backproj)
cv2.imshow('src', src)
cv2.imshow('hist_norm', hist_norm)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
images : 입력 영상 리스트
channels : 역투영 계산에 사용할 채널 번호 리스트
hist : 입력 히스토그램(numpy.ndarray)
ranges : 히스토그램 각 차원의 최솟값과 최댓값으로 구성된 리스트
scale : 출력 역투영 행렬에 추가적으로 곱할 값 : 없으면 1
dst : 출력 역투영 영상. 입력 영상과 동일 크기, cv2.CV_8U
channels = [1, 2]
cr_bins = 128
cb_bins = 128
histSize = [cr_bins, cb_bins]
cr_range = [0, 256]
cb_range = [0, 256]
ranges = cr_range + cb_range
HSV는 색상을 Hue 값 이용해 숫자로 표현하기 편할 때 사용합니다.
ycrcb 채널에서 y는 밝기 채널이기 때문에 하지 않았습니다.
cr_bins, cb_bins의 경우 cr_range, cb_range 0~255로 이루어져 256 [0,1,2,3~...]또는 128[(0,1), (2,3)~...]로 지정해주면 됩니다.
hist_norm의 결과입니다. Cb Cr 영역에서 저 부분에 해당합니다.
backproj = cv2.calcBackProject([src_ycrcb], channels, hist, ranges, 1)
히스토그램과 유사도에 따라 GrayScale 255 ~ 0으로 표현해줍니다.
dst = cv2.copyTo(src,backproj)
backproj는 마스크 역할을 합니다. src 부분에서 backproj 부분을 출력해줍니다.
'OpenCV-Python' 카테고리의 다른 글
dlib 눈 인식(Ear 알고리즘을 이용한 졸음인식) (0) | 2021.11.25 |
---|---|
OpenCV Python 얼굴 검출(dlib) (0) | 2021.09.14 |
OpenCV Python 색상 영역 검출 (0) | 2021.08.31 |
OpenCV Python 히스토그램 평활화 (0) | 2021.08.30 |
OpenCV Python 영상 명암비 조절(정규화) (0) | 2021.08.29 |