이처럼 불균일한 조명 성분을 가지고 있는 영상에 대해서는 하나의 임계값으로 객체와 배경을 제대로 구분하기 어렵기 때문에 각 픽셀마다 서로 다른 임계값을 사용하는 적응형 이진화(adaptive binarization) 기법을 사용하는 것이 효과적입니다. 적응형 이진화는 영상의 모든 픽셀에서 정해진 크기의 사각형 블록 영역을 설정하고, 블록 영역 내부의 픽셀 값 분포로부터 고유의 임계값을 결정하여 이진화하는 방식입니다. 이때 (x, y) 좌표에서의 임계값 T(x, y)는 다음 수식을 이용하여 결정합니다.
이 수식에서 μ(x, y)는 (x, y) 주변 블록 영역의 픽셀 값 평균이고, C는 임계값의 크기를 조정하는 상수입니다. 블록 내부 픽셀 값의 평균 μ(x, y)는 일반적인 산술 평균을 사용하거나 또는 가우시안 함수 형태의 가중치를 적용한 가중 평균을 사용합니다. 상수 C는 영상의 특성에 따라 사용자가 결정합니다.
OpenCV에서 적응형 이진화는 adaptiveThreshold() 함수를 이용하여 수행할 수 있습니다. adaptiveThreshold() 함수 원형은 다음과 같습니다.
void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C); |
|
• image |
입력 영상. CV_8UC1 또는 CV_8SC1 |
• dst |
출력 영상. src와 같은 크기, 같은 타입입니다. |
• maxValue |
이진화 결과 영상의 최댓값 |
• adaptiveMethod |
적응형 이진화에서 블록 평균 계산 방법 지정. ADAPTIVE_THRESH_MEAN_C 또는 ADAPTIVE_THRESH_GAUSSIAN_C 중 하나를 지정합니다. |
• thresholdType |
THRESH_BINARY 또는 THRESH_BINARY_INV 둘 중 하나를 지정합니다. |
• blockSize |
임계값 계산 시 사용하는 블록 크기. 3보다 같거나 큰 홀수를 지정해야 합니다. |
• C |
임계값 조정을 위한 상수. 블록 평균에서 C를 뺀 값을 임계값으로 사용합니다. |