본문 바로가기
Programming/Image Processing

[Image Processing][Python]이미지 히스토그램(Histogram)

by NoiB 2021. 12. 8.
반응형

오늘은 이미지의 히스토그램을 한 번 알아보고자 합니다. 이번 포스팅도 사전 설명이 좀 있을 예정입니다만 최대한 간략하게 하도록 노력해보겠습니다.

 

히스토그램(Histogram)이란 데이터의 특징을 한눈에 알아볼 수 있도록 데이터를 막대그래프 모양으로 나타낸 것입니다. 디지털 영상처리의 관점에서는 히스토그램을 통해 영상의 특징을 파악할 수 있다는 장점이 있는데요. 1 채널 이미지를 예로 들어보자면 0에서 255까지의 intensity 범위가 있고 해당 값을 갖는 픽셀의 개수를 세어 그래프로 만들어보면 명도에 따른 픽셀의 개수가 나오는 것이기에 이미지가 밝기 등을 알 수 있겠죠. 이전 포스팅에서도 알아봤듯이 intensity를 수학적 연산을 통해서 값을 변환시키면 그게 이미지에도 적용된다는 것을 봤었죠. 특정 연산을 통해서 원하는 이미지가 되게끔 가공을 하기 위해 히스토그램이 사용이 됩니다(히스토그램 스트레칭 같은 기술들이 있는데요 시간이 된다면 그것도 다음에 진행해보겠습니다).

 

결과 : 

코드 : 

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

def histogram(img):#use counting sort 
    h,w = img.shape[:2]
    cnt = np.array([0 for i in range(256)])
    for i in range(h):
        for j in range(w):
            cnt[int(img[i][j])] += 1
    return cnt

img = cv2.imread('./img_sample/img0.jpg',0)
print(img)
img_hist = histogram(img)
x = np.arange(256)
y = img_hist
print(img_hist)
plt.bar(x, y)
plt.show()

그래프 gui를 전부 만들어볼까 하다가 그냥 matplotlib를 사용했습니다. 내장함수에 히스토그램을 바로 출력해주는 함수가 있긴 합니다만, 그걸 쓰면 의미가 없기 때문에 직접 counting sort를 이용해서 만들어봤습니다(어째 counting sort가 어딜 가든 써먹게 되네요). 코드가 짧으니 이리저리 보기 편하게 변수들을 설정해줬지만 구태여 저렇게 메모리를 많이 만드실 필요가 없습니다.

 

위에서도 잠깐 말씀드렸지만 히스토그램 스트레칭이나 엔드 인 탐색같은 방법들이 있는데 시간이 된다면 그것도 진행해보겠습니다.

반응형