OpenCV-Python

OpenCV Python 히스토그램 평활화

rkftks22 2021. 8. 30. 13:00

히스토그램 평활화(= 균일화, 균등화, 평탄화) 

: 히스토그램이 그레이 스케일 전체 구간에서 균일한 분포로 나타나도록 변경하는 명암비 향상 기법

이 방법은 정규화와 다릅니다.

정규화는 벌어진 부분 균일

평활화의 경우 픽셀 값이 많이 뭉쳐있는 부분 넓게 벌어져있고, 적게 있는 부분 조금 벌어져있습니다.

 

cv2.equalizeHist(src [, dst]) [] : 생략 가능

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

src1 = cv2.imread('imgs/Lenna.png', cv2.IMREAD_GRAYSCALE)

# 원본
hist1 = cv2.calcHist([src1], [0], None, [
    256], [0, 256])
plt.subplot(3, 1, 1)
plt.title('hist1')
plt.plot(hist1)
dst1 = cv2.equalizeHist(src1)

# 평활화
hist2 = cv2.calcHist([dst1], [0], None, [
    256], [0, 256])
plt.subplot(3, 1, 2)
plt.title('equal')
plt.plot(hist2)

# 정규화
dst2 = cv2.normalize(src1, None, 0, 255, cv2.NORM_MINMAX)
hist3 = cv2.calcHist([dst2], [0], None, [
    256], [0, 256])
plt.subplot(3, 1, 3)
plt.title('normal')
plt.plot(hist3)


cv2.imshow('src1', src1)
cv2.imshow('dst1', dst1)
cv2.imshow('dst2', dst2)
plt.show()
cv2.waitKey(0)

src : 입력영상(그레이 스케일)

dst : 출력 영상

원본 / 평활화 / 정규화


컬러 히스토그램 평활화 : 색상 성분으로 하면 색 변할 수 있기 때문에 밝기 성분에 대해서만 히스토그램 평활화 수행

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

src1 = cv2.imread('imgs/Lenna.png')

src1_ycrcb = cv2.cvtColor(src1, cv2.COLOR_BGR2YCrCb)

channel = cv2.split(src1_ycrcb)

channel[0] = cv2.equalizeHist(channel[0])

dst_ycrcb = cv2.merge(channel)

dst1 = cv2.cvtColor(dst_ycrcb, cv2.COLOR_YCrCb2BGR)

cv2.imshow('src1', src1)
cv2.imshow('dst1', dst1)

plt.show()
cv2.waitKey(0)

 

출력 결과