본문 바로가기
Python

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

by xangmin 2022. 6. 23.
반응형

히스토그램은 도수 분포표를 그래프로 나타낸 것이다. 다시 말해, 무엇이 몇개 있는지 개수를 세어 놓은 것을 그래프로 나타낸 것을 의미한다. 미지의 픽셀값을 히스토그램으로 표시하는 것은 이미지를 분석하는 데 도움된다. 예를 들어 전체 이미지에서 픽셀 값이 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/

 

 

반응형

댓글