728x90

이미지 히스토그램

 

명암값을 x축, 명암의 빈도수를 y축으로 하는 히스토그램을 말한다

 

 

대충 아래와 같이 4 x 4 영상이 주어질때

 

 

위 영상의 히스토그램은 아래와 같이 구할수 있다.

 

 

정규화 히스토그램 normalized histogram의 경우

 

모든 픽셀의 명암 값의 합이 1이 되도록 하는 히스토그램으로

 

위 히스토그램의 값을 전체 크기(y * x) 만큼 나누어 주면 된다.

 

 

 

 

 

히스토그램 활용 용도

 

- 영상 특성 파악

 

- 평활화로 품질 개선

 

- 역투영을 통한 얼굴 검출방법

* 색상만을 활용하여 검출하는 방법으로 그다지 좋지 못함.

 

 

 

 

 

 

 

히스토그램으로 영상 특성 파악하기

 

첫번째 영상의 경우

 

밝은 부분과 어두운 부분으로 이분화 할수 있어 히스토그램 상에 봉우리가 2개가 나타남.

 

두번째 영상은 

 

시장에서 다양한 밝기 값들이 존재하다보니 고르게 분포된 양상을 보임

 

마지막 영상은

 

달 부분이 밝으나 매우 적고, 대부분 어두운 값이 차지하여 50 부근으로 가장 큰 빈도수를 가지고 있음.

 

import cv2
import matplotlib.pyplot as plt

dark_night = cv2.imread("./res/dark_night.jpg")
market = cv2.imread("./res/conventional_market.jpg")
moon = cv2.imread("./res/moon.jpg")

imgs = [dark_night, market, moon]

figure, axs = plt.subplots(figsize=(16, 16), nrows=3, ncols=3)
width, height = 400, 400

for i in range(3):
    resize = cv2.resize(imgs[i], dsize=(width, height))
    rgb = cv2.cvtColor(resize, cv2.COLOR_BGR2RGB)
    gray = cv2.cvtColor(resize, cv2.COLOR_RGB2GRAY)
    hist = cv2.calcHist(gray,[0],None,[256],[0,256])

    axs[i, 0].imshow(rgb)
    axs[i, 1].imshow(gray, cmap="gray")
    axs[i, 2].plot(hist)

plt.tight_layout()

 

 

 

 

 

 

히스토그램 평활화 histogram equalization를 통한 품질 개선 

 

위의 첫번째 그림과 같이

 

히스토그램 상에 명암 값이 한 쪽으로 치우쳐 진 경우

 

비슷한 명암을 가진 물체끼리 구분하기 어려운데

 

치우쳐진 명암 분포를 고르게 해주는 방법입니다.

 

 

 

 

아래와 같이 어두운 영상의 경우

 

잘 안보이는 부분이 많지만

 

히스토그램 평활화를 통해 개선 시킬수 있습니다.

 

 

 

 

 

 

 

위 이미지의 히스토그램을 보면

 

명암 분포가 낮은 곳 위주로 분포하고 있지만

 

 

 

히스토그램 평활화를 수행하여

 

명암 분포가 고르게 분포해지면

 

어두운 영역이 밝아져 선형하게 알아볼수 있게 됩니다.

 

 

joker = cv2.imread("./res/joker.jpg")
resize = cv2.resize(joker, dsize=(width, height))
rgb = cv2.cvtColor(resize, cv2.COLOR_BGR2RGB)
gray = cv2.cvtColor(resize, cv2.COLOR_RGB2GRAY)
hist = cv2.calcHist(gray,[0],None,[256],[0,256])
equ = cv2.equalizeHist(gray)
equ_hist = cv2.calcHist(equ,[0],None,[256],[0,256])



figure, axs = plt.subplots(figsize=(16,16),ncols=2, nrows=2)
axs[0, 0].imshow(gray, cmap="gray")
axs[0, 1].plot(hist)
axs[1, 0].imshow(equ, cmap="gray")
axs[1, 1].plot(equ_hist)
plt.tight_layout()

 

 

 

300x250

+ Recent posts