반응형
황선규 박사님의 <OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝>을 공부한 내용을 정리했습니다..
히스토그램 역투영(Histogram backprojection)
히스토그램 역투영은 영상의 각 픽셀이 주어진 히스토그램 모델에 얼마나 일치하는지를 검사하는 방법입니다.
임의의 색상 영역을 검출할 때 효과적입니다.
YCrCb 색 공간을 이용합니다. (밝기에 상관없이 색을 검출하기 위함입니다.)
HSV는 H 값을 이용해서 색상을 표현하기 좋을 때 이용합니다.
ROI로 색상 영역을 선택한 뒤 히스토그램을 만듭니다.
만든 히스토그램으로 히스토그램 역투영을 합니다.
히스토그램 역투영을 마스크로 이용하여 기존 영상과 마스크 연산을 통해 원하는 색을 검출할 수 있습니다.
1. 히스토그램 역투영 함수 - cv2.calcBackProjection
OpenCV에서 제공하는 cv2.calcBackProjection 함수를 이용하여 히스토그램 역투영을 할 수 있습니다.
히스토그램 역투영 함수를 이용하기 위해서는 먼저 히스토그램을 만들어야 합니다.
히스토그램을 만드는 함수는 cv2.calcHist이며 [파이썬 OpenCV] 영상의 히스토그램 분석하기 - cv2.calcHist
에서 자세히 설명해놨습니다.
[함수 설명]
cv2.calcBackProjection(images, channels, hist, ranges, scale, dst=None) -> dst
• images: 입력 영상 리스트
• channels: 역투영 계산에 사용할 채널 번호 리스트
• hist: 입력 히스토그램 (numpy.ndarray)
• ranges: 히스토그램 각 차원의 최솟값과 최댓값으로 구성된 리스트
• scale: 출력 역투영 행렬에 추가적으로 곱할 값
• dst: 출력 역투영 영상. 입력 영상과 동일 크기, cv2.CV_8U.
[예제 코드]
1. 입력 영상에서 ROI를 지정하고, 히스토그램 계산하기 - cv2.selectROI()
src = cv2.imread('cropland.png')
if src in None:
print('Image load failed')
sys.exit()
# ROI 부분 속성 추출
x, y, w, h = cv2.selectROI(src)
# BGR -> YCrCb
src_ycrcb = cv2.cvtColor(src, cv2.COLOR_BGR2YCrCb)
# crop은 사용자가 선택한 사각형 부분의 영상
crop = src_ycrcb[y:y+h, x:x+w]
channels = [1, 2] # 0인덱스인 y 성분은 쓰지 않음. y 성분은 밝기 정보.
cr_bins = 128 # cr을 표현하는 범위. 256을 128로 단순화.
cr_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) # 리스트 입력
# 히스토그램 스트레칭
# 히스토그램 큰 값은 너무 큰 값에 몰릴 수 있으므로 log스케일 해주기. +1을 해줘서 -1값을 0으로
hist_norm = cv2.normalize(cv2.log(hist + 1), None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8U)
2. 입력 영상 전체에 대해 히스토그램 역투영 - cv2.calcBackProject()
# 히스토그램 역투영으로 마스크 생성
backproj = cv2.calcBackProject([src_ycrcb], channels, hist, ranges, 1)
# 마스크 연산
dst = cv2.copyTo(src, backproj)
cv2.imshow('backprj', backproj)
cv2.imshow('hist_norm', hist_norm)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()
반응형
'Python > 파이썬 OpenCV 공부' 카테고리의 다른 글
[파이썬 OpenCV] 파이썬에서 크로마 키 합성하기 - cv2.inRange(), cv2.copyTo() 활용 (2) | 2020.09.29 |
---|---|
[파이썬 OpenCV] 히스토그램 역투영을 이용한 살색 영역 검출하기 - cv2.calcBackProject, cv2.calcHist (0) | 2020.09.29 |
[파이썬 OpenCV] 트랙바를 이용한 특정 색상 영역 추출 - cv2.inRange, cv2.createTrackbar (0) | 2020.09.28 |
[파이썬 OpenCV] 특정 색상 영역 추출 - cv2.inRange (3) | 2020.09.28 |
[파이썬 OpenCV] 히스토그램 평활화 - cv2.equlizeHist (0) | 2020.09.28 |