OpenCV

[OpenCV] 이미지 히스토그램 - calcHist

디벨로펄 2023. 1. 10.
반응형

작은 픽셀이 모여 하나의 이미지를 이루고 있다. 

각 픽셀은 R, G, B 값을 가지고 있다. 각 8바이트 0~255 숫자 중 하나의 값을 지닌다.

컬러 이미지에서 이미지 히스토그램은 상에서 각 R, G, B값의 분포를 나타낸다. 

GrayScale에서는 grayscale의 분포를 나타낸다.

관찰 데이터의 빈도수

 

 

- 히스토그램을 활용하면 데이터의 확률분포를 추정할 수 있다.

- 히스토그램은 이미지 픽셀 분포에서 매우 중요한 정보를 ㅈ공

- 히스토그램을 활용하면 다음 작업이 가능하다.

    1) 화질 개선 - 히스토그램 이퀄라이제이션

    2) 히스토그램 비교, 역투영

 

hist = cv2.calcHist(images=[image], channels=[i], mask=None, histSize=[histSize], ranges=[0, 256])
  • images : histogram을 계산할 이미지 배열,  배열이 input
  • channels : 히스토그램을 계산할 channel의 배열, 기본적으로 BGR로 읽음. 0 = B, 1=G, 2=R
    만약, 2개 이상의 이미지를 계산할 경우 3=2번째이미지의 B, 4=2번째 이미지의 G, 5 = 2번째 이미지의 R
  •  
  • histSize : 히스토그램에서 구간의 개수를 의미함. 최대 256개(0~256)
  • ranges : 해상도 느낌. 0~256으로 설정/ 히스토그램 구간 개수 256 설정하면 아래와 같은 결과 얻을 수 있음.
흑백 사진의 histogram
histSize = 256
hist = cv2.calcHist(images=[image], channels=[0], mask=None, histSize=[histSize], ranges=[0, 256])
histFlatten = hist.flatten() # 2차원 배열을 1차원으로 바꿔줌 
binX = np.arange(histSize) * (256 // histSize) # x축에 해당하는 값들을 만들어줌.

# binX와 histFlatten은 사이즈가 같아야한다.

plt.title("histogram of grayscale") #제목설정 
plt.plot(binX, histFlatten, color='r') # 꺾은선 그래프
plt.bar(binX, histFlatten, width=8, color='b') # 바차트.
plt.show() #보여주기

왼쪽 grayscale사진의 histogram

컬러 사진의 Histogram
image = cv2.imread('./sampleData/sample.jpg', cv2.IMREAD_COLOR)
histSize=256
nbins = 256 / histSize
binX = np.arange(histSize) * nbins
histColor = ['b', 'g', 'r']

# 색깔별로 히스토그램 뽑아서 그려줌.
for i in range(3):
    hist = cv2.calcHist(images=[image], channels=[i], mask=None, histSize=[histSize], ranges=[0, 256])
    print(hist)
    plt.plot(binX, hist, color=histColor[i])

plt.show()

 

 

BGR→ RGB 

OpenCV는 컬러 사진을 BGR 순서로 저장 Matplotlib에서는 RGB순서로 저장.

BGR로 그대로 MatplotLib에서 출력화면 왼쪽과 같이 나온다.

image = cv2.imread('./sampleData/sample.jpg', cv2.IMREAD_COLOR)
img= cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
plt.title("histogram of Color")
plt.imshow(img)
plt.show()

BGR2RGB로 변환하면 오른쪽 그림과 같이 정상적으로 나온다.

 

반응형

댓글