Python

[Python] 히스토그램 변환 with OpenCV

xangmin 2022. 6. 23. 17:17
반응형

히스토그램은 도수 분포표를 그래프로 나타낸 것이다. 다시 말해, 무엇이 몇개 있는지 개수를 세어 놓은 것을 그래프로 나타낸 것을 의미한다. 미지의 픽셀값을 히스토그램으로 표시하는 것은 이미지를 분석하는 데 도움된다. 예를 들어 전체 이미지에서 픽셀 값이 1인 픽셀이 몇 개이고, 2인 픽셀이 몇 개이고, 255인 픽셀이 몇 개인지까지 세는 것이다. 이렇게 함으로써 픽셀들의 색상이나 명암의 분포를 파악할 수 있다. 흑백 사진과 색상 이미지의 히스토 그램을 비교해보자.

 

OpenCV에서는 cv2.calcHist()라는 함수를 통해 히스토그램을 구현할 수 있다.

  • cv2.calHist(img, channel, mask, histSize, ranges)
    - img: 이미지 영상, [img]처럼 리스트로 감싸서 전달
    - channel: 분석 처리할 채널, 리스트로 감싸서 전달 - 1 채널: [0], 2 채널: [0, 1], 3 채널: [0, 1, 2]
    - mask: 마스크에 지정한 픽셀만 히스토그램 계산, None이면 전체 영역
    - histSize: 계급(Bin)의 개수, 채널 개수에 맞게 리스트로 표현 - 1 채널: [256], 2 채널: [256, 256], 3 채널: [256, 256, 256]
    - ranges: 각 픽셀이 가질 수 있는 값의 범위, RGB인 경우 [0, 256]

간단한 흑백 이미지의 히스토그램을 그려보자.

 

1.  흑백 이미지의 히스토그램 변환

 

위 이미지를 히스토그램 변환하는 코드이다.

# 회색조 1채널 히스토그램 (histo_gray.py)

import cv2
import numpy as np
import matplotlib.pylab as plt

#--① 이미지 그레이 스케일로 읽기 및 출력
img = cv2.imread('./img_gray.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('img', img)

#--② 히스토그램 계산 및 그리기
hist = cv2.calcHist([img], [0], None, [256], [0,256])
plt.plot(hist)

print("hist.shape:", hist.shape)  #--③ 히스토그램의 shape (256,1)
print("hist.sum():", hist.sum(), "img.shape:",img.shape) #--④ 히스토그램 총 합계와 이미지의 크기
plt.show()

 

아래와 같은 결과를 얻을 수 있다. 흑백 이미지 때문에 아래 히스토그램에서는 R, G, B가 모두 동일한 값인 것을 확인할 수 있다. 

히스토그램 변환 결과

 

 

2 . 색상 이미지의 히스토그램 변환

 

위 이미지를 히스토그램 변환하는 코드이다.

# 색상 이미지 히스토그램 (histo_rgb.py)

import cv2
import numpy as np
import matplotlib.pylab as plt

#--① 이미지 읽기 및 출력
img = cv2.imread('./img_rgb.jpg')
cv2.imshow('img', img)

#--② 히스토그램 계산 및 그리기
channels = cv2.split(img)
colors = ('b', 'g', 'r')
for (ch, color) in zip (channels, colors):
    hist = cv2.calcHist([ch], [0], None, [256], [0, 256])
    plt.plot(hist, color = color)
plt.show()

 

아래와 같은 결과를 얻을 수 있다. 색상 이미지 이기 때문에 서로 다른 R, G, B의 분포를 확인할 수 있다. 

 

 

출처 : https://bkshin.tistory.com/entry/OpenCV-10-%ED%9E%88%EC%8A%A4%ED%86%A0%EA%B7%B8%EB%9E%A8

 

 

resize 관련

https://076923.github.io/posts/Python-opencv-8/

 

 

반응형