[OpenCV 3.2] Histograms - 1 : Find, Plot, Analyze

히스토그램에 대한 지식과 OpenCV 라이브러리의 사용법에 대해 정리한다.


1. 히스토그램은 왜 필요한가?

영상 이진화의 적절한 임계값을 결정하기 위해서는 원본 영상의 픽셀값의 분포를 알고 분석해야한다.

300 x 300 사이즈의 작은 이미지 1장에만 픽셀수는 9만개이고, 한 픽셀이 갖을 수 있는 값은 0~255이므로 경우의 수는 9만x256 가지이다.

이러한 분포값을 알아보기 쉽게 그래프로 변환하여 시각화한 것을 히스토그램(Histogram)이라고 한다.

x축은 0~255 사이의 픽셀 값, y축은 해당하는 픽셀 값을 갖은 픽셀 수를 나타낸다.

2. OpenCV 라이브러리를 이용하여 히스토그램 계산하기

1) 히스토그램을 찾는 함수

void calcHist(const Mat* images, int nimages, const int* channels, InputArray mask, OutputArray hist, int dims, const int* histSize, const float** ranges, bool uniform=true, bool accumulate=false )

_1 images : 소스 이미지 배열, 히스토그램을 계산할 이미지들

_2 nimages : 소스 이미지 갯수, 소스 이미지 배열에 포함된 이미지들

_3 channels : 채널 번호 배열, 히스토그램을 계산할 채널 번호

 아래 그림과 같이 BGR 이미지 2장에 대해, 첫번째 이미지는 B 채널, 두번째 이미지는 G 채널에 대해서 히스토그램을 구하고자 한다면 {0, 4}를 배열에 넣어서 전달해야 한다. 

이미지 출처 - http://swprog.tistory.com/entry/OpenCV-histogram

_4 mask : 계산 영역, 옵션사항으로 Mat()를 전달하면 무시됨

_5 hist : 히스토그램 계산결과를 저장, 1차원 또는 다차원 배열

_6 dims : 히스토그램 계산결과를 저장한 _5 hist의 차원수, 32(CV_MAX_DIMS)보다 작은 자연수의 입력 필요

_7 histSize : 각 차원의 bin 개수, 빈도수를 분류할 칸의 개수

_8 ranges : 각 차원의 bin의 최소값과 최대값, 빈도수의 최소값과 최대값


2) 소스 코드


3. 계산한 히스토그램을 시각화

계산결과를 저장한 히스토그램 배열을 표시할 이미지의 너비값으로 normalize한 후에, line함수를 이용하여 빈도수를 세로로 선을 긋는다.

1) 소스 코드


4. 실행 결과




컴퓨터 비전과 영상 처리에 대해 독학을 하면서 정리한 걸 적고 있습니다.

전공과 무관하며 전문적인 지식이 아니므로 개인적인 의견과 부족하고 틀린 점이 많습니다.

추가 지식 및 잘못된 점을 지적해주시면 공부하는데 많은 도움이 되겠습니다. 감사합니다^^

- 푸어맨


[Reference]

[OpenCV 3.0.0-dev documentation] http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_histograms/py_histogram_begins/py_histogram_begins.html#histograms-getting-started

[Histogram 그리기] http://swprog.tistory.com/entry/OpenCV-histogram

[히스토그램 평활화] http://webnautes.tistory.com/1043

+ Recent posts