K 개발자
히스토그램 본문
히스토그램 계산과 표시
영상 분야에서의 히스토그램은 전체 영상에서 픽셀 값이 1인 픽셀이 몇 개이고 2인 픽셀이 몇 개이고 하는 식으로 픽셀 값이 255인 픽셀이 몇 개인지까지 세는 것을 말한다.
그렇게 하는 이유는 전체 영상에서 픽셀들의 색상이나 명암의 분포를 파악하기 위해서이다.
- cv2.calcHist(img, channel, mask, histSize, ranges)
- img : 입력 영상, [img]처럼 리스트로 감싸서 표현
- channel : 처리할 채널, 리스트로 감싸서 표현
- 1채널 : [0], 2채널 : [0, 1], 3채널 : [0, 1, 2]
- mask : 마스크에 지정한 픽셀만 히스토그램 계산
- histSize : 계급(bin)의 개수, 채널 개수에 맞게 리스트로 표현
- 1채널 : [256], 2채널 : [256, 256], 3채널 : [256, 256, 256]
- ranges : 각 픽셀이 가질 수 있는 값의 범위, RGB인 경우 [0, 256]
노멀라이즈
노멀라이즈(normalize, 정규화)는 원래 기준이 서로 다른 값을 같은 기준이 되게 만드는 것을 말한다.
영상 분야에서는 노멀라이즈를 가지고 픽셀 값들이 0~255에 골고루 분포하지 않고 특정 영역에 몰려 있는 경우 화질을 개선하기도 하고 영상 간의 연산을 해야 하는데, 서로 조건이 다른 경우 같은 조건으로 만들기도 한다.
- dst = cv2.normalize(src, dst, alpha, beta, type_flag)
- src : 노멀라이즈 이전 데이터
- dst : 노멀라이즈 이후 데이터
- alpha : 노멀라이즈 구간 1
- beta : 노멀라이즈 구간 2, 구간 노멀라이즈가 아닌 경우 사용 안 함
- type_flag : 알고리즘 선택 플래그 상수
- cv2.NORM_MINMAX : alpha와 beta 구간으로 노멀라이즈
- cv2.NORM_L1 : 전체 합으로 나누기, alpha = 노멀라이즈 전체 합
- cv2.NORM_L2 : 단위 벡터(unit vector)로 노멀라이즈
- cv2.NORM_INF : 최대 값으로 나누기
이퀄라이즈
이퀄라이즈(equalize, 평탄화)는 히스토그램으로 빈도를 구해서 그것을 노멀라이즈한 후 누적값을 전체 개수로 나누어 나온 결과 값을 히스토그램 원래 픽셀 값에 매핑한다.
이퀄라이즈는 각각의 값이 전체 분포에 차지하는 비중에 따라 분포를 재분배하므로 명암 대비(contrast)를 개선하는 데 효과적이다.
- dst = cv2.equalizeHist(src [, dst])
- src : 대상 이미지, 8비트 1채널
- dst : 결과 이미지
CLAHE
CLAHE(Contrast Limiting Adaptive Histogram Equalization)는 영상 전체에 이퀄라이즈를 적용했을 때 너무 밝은 부분이 날아가는 현상을 막기 위해 영상을 일정한 영역으로 나눠서 이퀄라이즈를 적용하는 것을 말한다.
- clahe = cv2.createCLAHE(clipLimit, tileGridSize) : CLAHE 생성
- clipLimit : Contrast 제한 경계 값, 기본 40.0
- tileGridSize : 영역 크기, 기본 8×8
- clahe : 생성된 CLAHE 객체
- clahe.apply(src) : CLAHE 적용
- src : 입력 영상
역투영
2차원 히스토그램과 HSV 컬러 스페이스를 이용하면 색상으로 특정 물체나 사물의 일부분을 배경에서 분리할 수 있다.
기본 원리는 물체가 있는 관심영역의 H와 V 값의 분포를 얻어낸 후 전체 영상에서 해당 분포의 픽셀만 찾아내는 것이다.
- cv2.calcBackProject(img, channel, hist, ranges, scale)
- img : 입력 영상, [img]처럼 리스트로 감싸서 표현
- channel : 처리할 채널, 리스트로 감싸서 표현
- 1채널 : [0], 2채널 : [0, 1], 3채널 : [0, 1, 2]
- hist : 역투영에 사용할 히스토그램
- ranges : 각 픽셀이 가질 수 있는 값의 범위
- scale :결과에 적용할 배율 계수
히스토그램 비교
히스토그램은 영상의 픽셀 값의 분포를 갖는 정보이므로 이것을 비교하면 영상에 사용한 픽셀의 색상 비중이 얼마나 비슷한지 알 수 있다.
- cv2.compareHist(hist1, hist2, method)
- hist1, hist2 : 비교할 2개의 히스토그램, 크기와 차원이 같아야 함
- method : 비교 알고리즘 선택 플래그 상수
- cv2.HISTCMP_CORREL : 상관관계(1 : 완전 일치, -1 : 최대 불일치, 0 : 무관계)
- cv2.HISTCMP_CHISQR : 카이제곱$^5$(0 : 완전 일치, 큰 값(미정) : 최대 불일치)
- cv2.HISTCMP_INTERSECT : 교차(1 : 완전 일치, 0 : 최대 불일치(1로 정규화한 경우))
- cv2.HISTCMP_BHATTACHARYYA : 바타차야$^6$(0 : 완전 일치, 1 : 최대 불일치)
- cv2.HISTCMP_HELLINGER : HISTCMP_BHATTACHARYYA와 동일