머신러닝 & 딥러닝/컴퓨터 비전

[OpenCV with Python] - 14. 히스토그램 평활화, 이퀄라이즈(histogram equalize) : cv2.equalizeHist()

by seokii 2021. 11. 10.
728x90
반응형

코드 및 이미지 : https://github.com/Seokii/Study_OpenCV

 

GitHub - Seokii/Study_OpenCV: study about OpenCV

study about OpenCV. Contribute to Seokii/Study_OpenCV development by creating an account on GitHub.

github.com

 

이번에는 cv2.equalizeHist() 를 사용하여 영상(이미지)의 히스토그램을 평활화 시키고, 간단하게 그려보도록 하겠습니다.

 

 

히스토그램 평활화(equalize)

히스토그램의 평활화는 명암 값의 분포가 한쪽으로 치우친 영상을 고르게 분포시켜주기 위한 방법을 의미합니다. 평활화를 통해 영상(이미지)의 명암 대비를 증가시켜 인지도를 높이고, 화질을 개선하고자 할 때 쓰이게 됩니다.

평활화를 하는 과정은 다음과 같습니다.

 

1. 히스토그램을 계산

2. 히스토그램의 빈도값에서 누적 빈도수(누적합) 계산

3. 계산한 누적 빈도수(누적합) 값을 정규화하기

4. 결과값 = 3의 계산값 * 최대 화소값

 

OpenCV에서는 이 과정을 자동으로 계산해 주는 함수가 존재합니다.

 

 

함수 설명

1. cv2.equalizeHist( src[, dst] ) -> dst

아래는 opencv documentation에 따른 설명입니다.

- src에 대한 히스토그램 h를 계산합니다.

- 히스토그램 빈의 합이 255가 되도록 히스토그램을 정규화합니다.

- 히스토그램의 적분을 계산합니다: 

H'를 조회 테이블로 사용하여 이미지를 변환합니다 : dst(x, y) = H'(src(x, y))

 

 

주피터 노트북으로 구현하기

In [1] : 

import numpy as np
import cv2
from matplotlib import pyplot as plt

- 필요한 라이브러리를 불러옵니다. (opencv, numpy, matplotlib)

 

 

In [2] : 

forest = cv2.imread("images/dark_forest.jpg", cv2.IMREAD_GRAYSCALE)

- 히스토그램 평활화를 수행하기 위한 이미지를 불러옵니다.

- 이미지는 그레이스케일(흑백)로 불러왔습니다.

 

 

In [3] : 

hist = cv2.calcHist([forest], [0], None, [256], [0,256])

- cv2.calHist() 함수를 사용해 평활화 전의 히스토그램을 계산합니다.

 

 

In [4] : 

plt.hist(forest.ravel(), 256, [0,256])
plt.show()

- plt.hist() 함수를 사용해 히스토그램을 그리고 확인합니다.

 

 

In [5] : 

equal = cv2.equalizeHist(forest)

- cv2.equalizeHist() 함수를 사용해 히스토그램 평활화를 계산합니다.

 

 

In [6] : 

plt.hist(equal.ravel(), 256, [0,256])
plt.show()

- 평활화된 히스토그램을 위와 같이 그리고 분포를 확인합니다.

- 원래의 히스토그램과 비교하면 정규화를 통해서 분포가 더 균등하게 이루어져 있는 것을 확인할 수 있습니다.

 

 

In [7] : 

cv2.imshow("forest", forest)
cv2.imshow("equalization forest", equal)
cv2.waitKey(0)
cv2.destroyAllWindows()

- 왼쪽 이미지가 원본이며, 오른쪽 이미지가 히스토그램 평활화(equalize)를 수행한 이미지입니다.

- 히스토그램 평활화를 통해 명암 대비가 증가하여 인지도가 높아진 것을 확인할 수 있습니다.

 

 

728x90
반응형

댓글