- 히스토그램 역투영 (Histogram backprojection)
- 영상의 각 픽셀이 주어진 히스토그램 모델에 얼마나 일치하는지를 검사하는 방법
- 임의의 색상 영역을 검출할 때 효과적
- 히스토그램 역투영 함수
cv2.calBackProjection(images,channels,hist,ranges,scale,dst=None) -> dst
• images: 입력 영상 리스트
• channels: 역투영 계산에 사용할 채널 번호 리스트
• hist: 입력 히스토그램 (numpy.ndarray)
• ranges: 히스토그램 각 차원의 최솟값과 최댓값으로 구성된 리스트
• scale: 출력 역투영 행렬에 추가적으로 곱할 값
• dst 출력 역투영 영상 . 입력 영상과 동일 크기 , cv2.CV_8U
import sys
import numpy as np
import cv2
# 입력 영상에서 ROI를 지정하고, 히스토그램 계산
src = cv2.imread('cropland.png')
if src is None:
print('Image load failed!')
sys.exit()
x, y, w, h = cv2.selectROI(src) #마우스로 선택 영역을 제공해준다
src_ycrcb = cv2.cvtColor(src, cv2.COLOR_BGR2YCrCb)
crop = src_ycrcb[y:y+h, x:x+w] #crop는 사용자가 선택한 사각형 영역의 부분 영상이다
channels = [1, 2] #cr 채널과 cb 채널만 이용한다 y채널은 그레이스케일 값으로 컬러보다는 밝기 정보이기 때문이다
cr_bins = 128 #256 을 쓰는것이 정상인데 그냥 단순화 목적으로 줄임
cb_bins = 128
histSize = [cr_bins, cb_bins]
cr_range = [0, 256] #0~255 까지 간다는 의미
cb_range = [0, 256]
ranges = cr_range + cb_range
hist=cv2.calcHist([crop],channels,None,histSize,ranges)
# 히스토그램 스트레칭
# 히스토그램 큰 값은 너무 큰 값에 몰릴 수 있으므로
# log스케일 해주기. +1을 해줘서 -1값을 0으로
hist_norm = cv2.normalize(cv2.log(hist+1), 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('backproj', backproj)
cv2.imshow('hist_norm', hist_norm)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()
'Computer Vision > opencv(python)' 카테고리의 다른 글
[21] 4.필터링 1)필터링 이해하기 (0) | 2021.03.19 |
---|---|
[20] 크로마키 합성 (0) | 2021.03.18 |
[18] 7) 특정 색상 영역 추출 (0) | 2021.03.18 |
[17] 6) 히스토그램 평활화 (0) | 2021.03.18 |
[16] 5) 영상의 명암비 조절 (0) | 2021.03.18 |