728x90
반응형
히스토그램
- 영상의 픽셀 값 분포를 그래프의 형태로 표현한 것
- 예를 들어, 그레이스케일 영상에서 각 그레이스케일 값에 해당하는 픽셀의 개수를 구하고, 이를 막대 그래프의 형태로 표현

정규화된 히스토그램(Normalized histogram)
- 각 픽셀의 개수를 영상 전체 픽셀 개수로 나누어준 것
- 해당 그레이스케일 값을 갖는 픽셀이 나타날 확률

영상과 히스토그램의 관계


히스토그램을 보고 그림의 대략적인 밝기를 알 수 있다.
히스토그램 구하기
cv2.calcHist(images, channels, mask, histSize, ranges, hist=None, accumulate=None) -> dst
- images : 입력 영상 리스트
- channels : 히스토그램을 구할 채널을 나타내는 리스트
- mask : 마스크 영상. 입력 영상 전체에서 히스토그램을 구하려면 None을 지정.
- histSize : 히스토그램 각 차원의 크기(빈(bin)의 개수)를 나타내는 리스트
- ranges : 히스토그램 각 차원의 최솟값과 최댓값으로 구성된 리스트
- hist : 계산된 히스토그램(numpy.ndarray)
- accumulate : 기존의 hist 히스토그램에 누적하려면 True, 새로 만들려면 False
그레이스케일 영상의 히스토그램 구하기
src = cv2.imread('lenna.bmp', cv2.IMREAD_GRAYSCALE)
# cv2.calcHist(images, channels, mask, histSize, ranges, hist=None, accumulate=None) -> dst
hist = cv2.calcHist([src], [0], None, [256], [0, 256])
plt.plot(hist)
plt.show()

컬러 영상의 히스토그램 구하기
src = cv2.imread('lenna.bmp')
colors = ['b', 'g', 'r']
bgr_planes = cv2.split(src)
for (p, c) in zip(bgr_planes, colors):
hist = cv2.calcHist([src], [0], None, [256], [0, 256])
plt.plot(hist, color=c)
plt.show()
* zip 함수 이해가 잘 되지 않으면 글 아래 간단한 예시가 있음.

OpenCV 그리기 함수로 그레이스케일 영상의 히스토그램 나타내기
def getGrayHistImage(hist):
imgHist = np.full((100, 256), 255, dtype=np.uint8)
histMax = np.max(list)
for x in range(256):
pt1 = (x, 100)
pt2 = (x, 100 - int(hist[x, 0] * 100 / histMax))
cv2.line(imgHist, pt1, pt2, 0)
return imgHist
src = cv2.imread('lenna.bmp', cv2.IMREAD_GRAYSCALE)
hist = cv2.calcHist([src], [0], None, [256], [0, 256])
histImg = getGrayHistImage(hist)

* zip 함수 이해를 돕기 위한 간단한 예시
>>> numbers = [1, 2, 3]
>>> letters = ["A", "B", "C"]
>>> for pair in zip(numbers, letters):
... print(pair)
...
(1, 'A')
(2, 'B')
(3, 'C')728x90
반응형
'OpenCV' 카테고리의 다른 글
| OpenCV 영상처리 - 히스토그램 평활화(cv2.equalizeHist) (0) | 2024.03.18 |
|---|---|
| OpenCV 영상처리 - 명암비 조절, cv2.normalize (0) | 2024.03.18 |
| OpenCV 영상처리 - 컬러 영상과 색 공간 (0) | 2024.03.18 |
| OpenCV 영상처리 - 산술 및 논리 연산 (0) | 2024.03.18 |
| OpenCV 영상처리 - 밝기 조절 (0) | 2024.03.18 |