딥러닝 모델을 사용해보셨다면 라벨링이라는 단어를 많이 들어보셨을 겁니다.

 

라벨링이란 이미지 속 비슷한 무리의 픽셀끼리 그룹화 하여 구별이 가능하도록 이름을 새기는 것을 말합니다.

 

 

이진화 라벨링은 검은색과 흰색 픽셀로 이루어진 이미지를 라벨링하는 것입니다.

 

더욱 자세하게 아래 그림의 예로 설명하자면 아래의 이미지가 있을 때, 이미지(x, y)   (0,0) -> (1,0) -> (2,0) ... 순으로

 

픽셀을 지나치며 회색의 픽셀을 찾습니다. 회색의 픽셀을 찾으면 주변 픽셀들과의 상관 관계를 찾으며, 이때 4방향과

 

8방향 접근 방법을 사용합니다. 4방향 접근은 픽셀의 좌우, 상단의 상관 관계를 찾는 것이며, 8방향 접근은 좌우, 상단

 

그리고 대각선의 상관 관계를 찾습니다.

 

 

이진화로 된 이미지

 

4방향 접근 방법

 

8방향 접근 방법

 

Opencv에서 제공하는 connectedComponentsWithStats() 함수는 이진화로 표현된 이미지를 이용하여 라벨링을 처리가

 

가능하며, Opencv 3.0이상부터 본 함수를 제공해주고 있습니다.

 

 

connectedComponentsWithStats() 함수의 인자는 총 6가지를 입력해야 합니다.

 

1) 입력 이미지

 

2) 라벨링 결과 이미지

 

3) 라벨링 된 이미지의 정보

 

4) 라벨링 된 이미지의 중심 좌표

 

5) 4방향/8방향

 

6) 타입

 

 

아래 코드를 통해 connectedComponentsWithStats() 함수를 사용해보도록 하겠습니다.

 

* 본 코드는 Opencv 3.1.0 Version에서 사용하였습니다.

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
	Mat image = imread("D:\\과일.jpg");
	Mat image_gray;
	Mat image_bi;
	Mat label_box;

	// 라벨 레이어 변수
	Mat img_label;
	Mat stats;
	Mat centroids;
	int label;


	//이미지 축소/확대
	resize(image, image, Size(500, 500));

	// 복사
	label_box = image.clone();

	//그레이스케일
	cvtColor(image, image_gray, CV_RGB2GRAY);

	//이진화
	threshold(image_gray, image_bi, 230, 255, CV_THRESH_BINARY);
	image_bi = ~image_bi;

	label = connectedComponentsWithStats(image_bi, img_label, stats, centroids, 8, CV_32S);
	for (int j = 1; j < label; j++) 
	{
		int area = stats.at<int>(j, CC_STAT_AREA);
		int left = stats.at<int>(j, CC_STAT_LEFT);
		int top = stats.at<int>(j, CC_STAT_TOP);
		int width = stats.at<int>(j, CC_STAT_WIDTH);
		int height = stats.at<int>(j, CC_STAT_HEIGHT);

		// 라벨링 박스
		rectangle(label_box, Point(left, top), Point(left + width, top + height), Scalar(0, 0, 255), 3);

	}

	imshow("original", image);
	imshow("Binary", image_bi);
	imshow("Label box", label_box);

	waitKey(0);
}

원본 이미지

 

이진화된 이미지

 

라벨링 이미지

 

 

 

< 참고 자료>
https://skkuassa.tistory.com/203

 

opencv , image processing , 2 pass labeling

살펴보기.. openCV에 신기하게도 라벨링이 없는듯하다. 라벨링 (Labeling) 이란 바이너리 이미지 ( 0과 1만 있는 이미지) 로 처리하는 과정 중에서 독립된 개체를 찾아서 라벨을 붙여주는 알고리즘이다. 여기서 배..

skkuassa.tistory.com

 

+ Recent posts