Processor

【OpenCV】 히스토그램(Histogram)

작성자 임베디드코리아 작성일26-04-16 22:08 조회118회 댓글0건
< *  히스토그램(Histogram)  * >

◆ 히스토그램이란 도수 분포표 중 하나로 데이터의 분포를 몇 개의 구간으로 나누고
    각 구간에 속하는 데이터를 시각적으로 표현한 막대그래프이다.
◆ 이미지에서 사용하는 히스토그램은 X 축을 픽셀의 값으로 사용하고 Y 축을 해당 픽셀의 개수로 표현한다.
◆ 이미지의 픽셀값을 히스토그램으로 표현하면 이미지의 특성을 쉽게 확인할 수 있다.
◆ 히스토그램은 다음과 같은 세 가지의 중요한 요소를 갖고 있다.
    - 빈도 수(BINS): 히스토그램 그래프의 X 축 간격
    - 차원 수(DIMS): 히스토그램을 분석할 이미지의 차원
    - 범위(RANGE): 히스토그램 그래프의 X 축 범위

◆ 빈도 수는 히스토그램의 X 축 간격이다.
    - 픽셀값의 범위는 0~255로 총 256개의 범위를 갖고 있으며,
      빈도 수의 값이 8이라면 0 ~ 7, 8 ~ 15, …, 248 ~ 255의 범위로 총 32개의 막대가 생성된다.
◆ 차원 수는 이미지에서 분석하고자 하는 색상 차원을 의미한다.
◆ 그레이스케일은 단일 채널이므로 하나의 차원에 대해 분석할 수 있고
    색상 이미지는 다중 채널이므로 세 개 이상의 차원에 대해 분석할 수 있다.
◆ 범위는 이미지에서 측정하려는 픽셀값의 범위로서, 특정 픽셀값 영역에 대해서만 분석하게 하는 데 사용된다.


----< 예제 : Histogram.py  >-------------------------------------------------------------------
import cv2
import numpy as np

src = cv2.imread("road.jpg")
gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
result = np.zeros((src.shape[0], 256), dtype=np.uint8)

hist = cv2.calcHist([gray], [0], None, [256], [0, 256])
cv2.normalize(hist, hist, 0, result.shape[0], cv2.NORM_MINMAX)

for x, y in enumerate(hist):
    cv2.line(result, (int(x), result.shape[0]), (int(x), result.shape[0] - int(y)), 255)

dst = np.hstack([gray, result])

cv2.imshow("dst", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
--------------------------------------------------------------------------------------------------------
▶ hist = cv2.calcHist([gray], [0], None, [256], [0, 256])

  • 히스토그램은 히스토그램 계산 함수(cv2.calcHist)를 통해 분포를 계산할 수 있다.
  • cv2.calcHist(연산 이미지, 특정 채널, 마스크, 히스토그램 크기, 히스토그램 범위)를
    이용하여 히스토그램을 계산한다.
  • 특정 채널은 차원 수(DIMS)를 설정한다.
      - 그레이스케일 이미지는 단일 채널이므로, 0을 사용한다.
  • 마스크는 특정 영역에 대해서만 연산할 때 사용한다.
      - 해당 영역은 없으므로, None을 할당한다.
  • 히스토그램 크기는 빈도 수(BINS)를 설정한다.
      - 픽셀의 범위는 0 ~ 255 이므로, [256]을 할당한다.
  • 히스토그램 범위는 범위(RANGE)를 설정한다.
    -- 예외 사항이 없으므로, 0 ~ 255의 범위를 계산하기 위해 [0, 256]을 할당한다.