Python/OpenCV

히스토그램

ddingz 2022. 3. 3. 15:54

히스토그램 계산과 표시

영상 분야에서의 히스토그램은 전체 영상에서 픽셀 값이 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와 동일