이전 글까지 영상에 대해 알아보고, 영상의 배경과 객체를 이진화를 통해 구별하였습니다.
이번 글에서는 이렇게 구별된 객체들을 각각의 객체로 구별 및 분석하는 라벨링 기법(또는 레이블링이라고도 함)에 대해 알아보겠습니다.
이해
영상에서 라벨링은 보통 이진화 영상에서 수행됩니다. 라벨링은 이진화된 영상의 검은색 픽셀(0)을 배경으로, 흰색 픽셀(255)을 객체로 인식합니다. 객체는 인접한 픽셀까지 하나의 객체로 인식하며, 하나의 객체를 이루는 모든 픽셀에는 같은 라벨링 번호가 부여됩니다.
아래 그림은 이진화 영상에서 라벨링을 수행한 결과 이미지 입니다.
![](https://3001ssw.com/wp-content/uploads/2023/08/img-min-91.png)
코드
OpenCV에서는 라벨링을 수행하는 connectedComponents()함수를 제공합니다.
/**
@param image 입력 영상
@param labels 출력 라벨 행렬
@param connectivity 연결성
@param ltype 라벨 개수
*/
int connectedComponents(InputArray image, OutputArray labels, int connectivity = 8, int ltype = CV_32S);
샘플 코드는 아래와 같습니다.
uchar data[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 255, 255, 0, 0, 0, 0, 0, 0, 0,
0, 255, 255, 0, 0, 0, 0, 0, 0, 0,
0, 255, 255, 0, 0, 255, 255, 255, 255, 0,
0, 255, 255, 0, 0, 255, 255, 255, 255, 0,
0, 255, 255, 0, 0, 0, 0, 255, 255, 0,
0, 0, 0, 0, 0, 0, 0, 255, 255, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 255, 255, 255, 255, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
Mat src = Mat(10, 10, CV_8UC1, data);
Mat labels;
int cnt = connectedComponents(src, labels);
cout << src << endl << endl;
cout << labels << endl << endl;
cout << "라벨 개수: " << cnt << endl;
실행 결과는 아래와 같습니다.
![](https://3001ssw.com/wp-content/uploads/2023/08/img_1-min-76.png)
설명
1. 라벨링이 되기 전 영상은 Mat src에 입력 하였습니다.
2. Mat labels에 라벨링이 수행된 결과가 저장되어 있습니다.
3. 라벨링은 0, 1, 2, 3이 되었기 때문에 개수가 4로 출력 되었습니다.
아래는 이해를 돕기 위한 이미지 입니다.
![](https://3001ssw.com/wp-content/uploads/2023/08/img_2-min-69.png)
이상으로 라벨링에 대해 대략적으로 알아보았습니다.