이미지 처리

[opencv] 이미지 히스토그램 구하기

감자156 2023. 8. 15. 11:29
반응형

opencv2를 이용하여 이미지 색상 히스토그램 구하기

 

히스토그램이란?

픽셀 값 분포를 그래프형식으로 표현한 것이다. 히스토그램을 통해서 이미지의 밝기나 명암비를 분석할 수 있다.

 

예시 히스토그램
예시 히스토그램

 

이런 꼴을 가지는데, x축은 픽셀의 명암값 y축은 픽셀의 갯수를 나타낸다.

(왼) 원본 이미지 (오) grayscale 이미지
(왼) 원본 이미지 (오) grayscale 이미지

 

위 이미지에서 numpy(plt)를 활용한 방법, cv2를 활용한 방법 두가지로 이미지의 색상 히스토그램을 구해보겠다.

 

히스토그램 그리기

1) cv2 히스토그램

opencv2 calcHist 함수
opencv2 calcHist 함수

cv2를 활용하여 각 color scale(gray는 grayscale)에 해당하는 픽셀의 갯수를 구하고 막대 그래프 형태로 표현하면, 아래와 같은 결과가 나온다.

 

import matplotlib.pyplot as plt
import cv2

####### gray scale
gray = cv2.imread('cat.jpg',cv2.IMREAD_GRAYSCALE)
#gray = cv2.resize(gray, dsize=(0,0), fx = 0.1, fy = 0.1)

hist = cv2.calcHist([gray],[0],None,[256],[0,256])
plt.xlim([0,256])
plt.plot(hist)


######## rgb channel
origin = cv2.imread('cat.jpg',cv2.IMREAD_COLOR)
origin = cv2.resize(origin, dsize=(0,0), fx = 0.1, fy = 0.1)

color = ['b','g','r']
for i in range(3): # b,g,r
  hist = cv2.calcHist([origin],[i],None,[256],[0,256])
  plt.plot(hist, c=color[i], label = color[i])
plt.xlim([0,256])
plt.legend()
plt.show()

(왼) gray scale 히스토그램 (오) rgb 히스토그램
(왼) gray scale 히스토그램 (오) rgb 히스토그램

 

 

2) numpy 히스토그램

 

plt를 사용하면 더 간단히 구할 수 있다.

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

 

plt로 그린 히스토그램
plt로 그린 히스토그램

 

밝기에 따른 히스토그램 비교하기

같은 이미지에서, 밝기가 다를 때 히스토그램이 어떻게 변화하는지 알아보겠다.

import matplotlib.pyplot as plt
import cv2

gray = cv2.imread('cat.jpg',cv2.IMREAD_GRAYSCALE)
gray = cv2.resize(gray, dsize=(0,0), fx = 0.1, fy = 0.1)

img1 = cv2.add(gray,-20)
img3 = cv2.add(gray,20)

img_list = [img1, gray, img3]
name = ['dark', 'origin', 'light']
for i in range(3): 
  hist = cv2.calcHist([img_list[i]],[0],None,[256],[0,256])
  plt.plot(hist, label = name[i])
# plt.xlim([0,256])
plt.legend()
plt.show()

 

(왼) dark (가운데) origin (오) light
(왼) dark (가운데) origin (오) light

 

이미지 밝기에 따른 히스토그램 변화
이미지 밝기에 따른 히스토그램 변화

 

 

이처럼 이미지가 밝을수록 오른쪽으로 치우치는 것을 확인할 수 있다.

반응형