딥러닝 모델을 사용해보셨다면 라벨링이라는 단어를 많이 들어보셨을 겁니다.
라벨링이란 이미지 속 비슷한 무리의 픽셀끼리 그룹화 하여 구별이 가능하도록 이름을 새기는 것을 말합니다.
이진화 라벨링은 검은색과 흰색 픽셀로 이루어진 이미지를 라벨링하는 것입니다.
더욱 자세하게 아래 그림의 예로 설명하자면 아래의 이미지가 있을 때, 이미지(x, y) (0,0) -> (1,0) -> (2,0) ... 순으로
픽셀을 지나치며 회색의 픽셀을 찾습니다. 회색의 픽셀을 찾으면 주변 픽셀들과의 상관 관계를 찾으며, 이때 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' 카테고리의 다른 글
[OpenCV] 선택 영역 이미지 추출 setMouseCallback() (0) | 2020.04.15 |
---|---|
[Opencv] 동영상 저장 (0) | 2020.04.10 |
[Opencv] 이미지 파일에 텍스트 숨기기 - 스테가노그래피 (0) | 2020.04.03 |
[Opencv] 이미지 픽셀 접근 (0) | 2020.03.29 |
[Opencv] 이미지 속 특정 영역 자르기 Range() (1) | 2020.03.29 |