반응형
히스토그램은 도수 분포표를 그래프로 나타낸 것이다. 다시 말해, 무엇이 몇개 있는지 개수를 세어 놓은 것을 그래프로 나타낸 것을 의미한다. 미지의 픽셀값을 히스토그램으로 표시하는 것은 이미지를 분석하는 데 도움된다. 예를 들어 전체 이미지에서 픽셀 값이 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/
반응형
'Python' 카테고리의 다른 글
[Python] 2D 이미지 FFT 적용하기 (2) | 2022.10.05 |
---|---|
멀티 프로세스(Multi-Process) 사용하기 with Python (0) | 2022.07.07 |
멀티 프로세스(Multi-Process) 응용하기 with Python (0) | 2022.05.19 |
멀티 스레드(Multi-Thread ) 응용하기 with Python (0) | 2022.05.19 |
멀티 스레드(Multi-Thread ) 시작하기 with Python (0) | 2022.05.19 |
댓글