이진화 다음은 잡음제거를 위한 필터링 연산이다. 여기서는 cvErode라는 함수 하나로 간단히 구현된다.
약간 어려울 수 있는 부분은 라벨링 과정인데, 기존에 쓰던 라벨링 알고리즘은 이진화된 영상에서의 살아남은 덩어리들의 면적을 찾아서 라벨링하는 방법이었다. OpenCV에서도 cvBlob이라는 것을 사용해서 비슷하게 처리하는 것 같지만, 해당 함수를 찾다가 포기하고 윤곽선 찾기 함수 기반으로 하는 방법이 있길래 그걸 사용중이다. 함수는 cvFindContours인데, 새로 선언해 주어야 하는 변수가 몇 개 있다.
IlpImage *image = cvCreateImage(cvSize(width, height), 8, 1);
CvMemStorage *Storage = veCreateMemStorage();
CvSeq *Contours = 0;
cvFindContours(image, Storage, &Contours, sizeof(CvContours), 1, 2);
이렇게 하면, Contours변수에 윤곽선 정보가 저장된다. 이 변수의 데이터를 기반으로 라벨링을 하면된다. 크기에 대한 정보는 해당 면적의 윤곽선 정보와 비슷하다고 볼 수 있으므로(덩어리가 상당히 복잡한 모양이 아니라면), cvArcLength(Contours, CV_WHOLE_SEQ, -1) 함수를 사용하여 윤곽선 정보를 추출하고, 일정 기준 이상일 때, 해당 영상에 cvDrawContours 함수를 사용하여 해당 영역에 원하는 데이터로 칠해주면 된다.
실험적으로 어떤 식으로 윤곽선 정보가 저장이 되는지 시도해 봤는데, 윤곽선의 길이가 작은 것 부터 순서대로 저장되는 듯 보였다. 라벨링하는데 알아두면 좋을 것이다.