OpenCV에서 영상의 히스토그램을 구하려면 calcHist() 함수를 사용합니다. calcHist() 함수는 한 장의 영상뿐만 아니라 여러 장의 영상으로부터 히스토그램을 구할 수 있고, 여러 채널로부터 히스토그램을 구할 수도 있습니다. 또한 히스토그램 빈 개수도 조절할 수 있습니다. 다양한 형식의 히스토그램 생성을 지원하기 때문에 calcHist() 함수의 사용법은 꽤 복잡한 편입니다. calcHist() 함수 원형과 인자에 대한 설명은 다음과 같습니다.
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); |
|
• images |
입력 영상의 배열 또는 입력 영상의 주소. 영상의 배열인 경우, 모든 영상의 크기와 깊이는 같아야 합니다. |
• nimages |
입력 영상 개수 |
• channels |
히스토그램을 구할 채널을 나타내는 정수형 배열 |
• mask |
마스크 영상. 입력 영상과 크기가 같은 8비트 배열이어야 합니다. 마스크 행렬의 원소 값이 0이 아닌 좌표의 픽셀만 히스토그램 계산에 사용됩니다. mask 인자에 Mat() 또는 noArray()를 지정하면 입력 영상 전체에 대해 히스토그램을 구합니다. |
• hist |
출력 히스토그램. CV_32F 깊이를 사용하는 dims-차원의 행렬입니다. |
• dims |
출력 히스토그램의 차원 수 |
• histSize |
각 차원의 히스토그램 배열 크기를 나타내는 배열(즉, 각 차원의 히스토그램 빈 개수를 나타내는 배열) |
• ranges |
각 차원의 히스토그램 범위. 등간격 히스토그램이면(uniform = true), ranges[i]는 각 차원의 최솟값과 최댓값으로 구성된 배열이고 [최솟값, 최댓값)2 범위를 나타냅니다. 비등간격 히스토그램이면(uniform = false), ranges[i]는 각각의 구역을 나타내는 histSize[i]+1개의 원소로 구성된 배열입니다. |
• uniform |
히스토그램 빈의 간격이 균등한지를 나타내는 플래그 |
• accumulate |
누적 플래그. 이 값이 true이면 hist 배열을 초기화하지 않고 누적하여 히스토그램을 계산합니다. |
2 대괄호와 소괄호를 이용하여 범위를 나타낼 때, 대괄호는 포함을 의미하고 소괄호는 포함하지 않음을 의미합니다. 예를 들어 변수 x의 범위가 [a, b)라는 것은 a≤x<b를 의미합니다.