Blob

1 개요

이웃하는 픽셀들의 집합으로, 픽셀들의 밝기값을 기준으로 영역을 구분하는 알고리즘입니다.
설정한 조건에 해당하는 픽셀들을 하나로 연결하여 객체로 만들어줍니다. 연결방향은 4방향과 8방향을 지원합니다.
일반적으로 이미지에서 객체나 특징을 추출하는데 사용됩니다.

2 알고리즘 상세 설명

Result Image
Result Image Boundary RectBoundary Rect ContourContour
MERMinimum Enclosing Rectangle ConvexhullConvex hull
Fig.1 Blob

이미지에서 객체 또는 특징을 검출하는데 사용되며, 결과를 다양한 타입으로 얻을 수 있습니다.

Result Image Sort Image Sort Cluster Image
Result ImageOriginal Result Sort 1Perimeter Sort 2Cluster Sort
Fig.2 Blob Sort

결과들을 특정 기준에 따라 정렬할 수 있습니다(Fig.2). 위의 이미지에서 숫자는 객체 번호입니다.
Perimeter 기준으로 정렬한 결과와, cluster 단위로 정렬한 결과입니다.
cluster 단위 정렬의 경우 같은 색상의 번호가 하나의 cluster입니다. cluster 정렬은 결과 객체가 일정한 규칙으로 있는 경우 사람이 인식하는 순서로 결과를 얻을 수 있습니다.

Result Image Filter Image
Result ImageOriginal Result Filter 1Filter : Area < 100 Filter 2Filter : Area > 100
Fig.3 Blob Filter

Blob 결과에서 조건에 맞지 않는 객체들을 제외할 수 있습니다. Fig.3은 각 해당 조건에 맞는 객체를 제거한 결과입니다.

3 파라미터 설정 및 사용 방법

4 예제 코드

CBlob blob;
//////////////////////////////////
// 공통 파라미터 설정
//////////////////////////////////

//////////////////////////////////
// 추가 옵션 설정
//////////////////////////////////

blob.SetThreshold(180);
blob.SetLogicalCondition(ELogicalCondition_Less);
blob.Execute();

// 넓이가 100 이하인 객체 제거
blob.Filter(CBlob::EFilterItem_Area, 100., ELogicalCondition_LessEqual);

// 둘레를 기준으로 정렬
blob.Sort(CBlob::EFilterItem_Perimeter, CBlob::EOrder_Ascending);

// 결과를 경계 사각형으로 얻어오기
CFLFigureArray boundaryRects;
blob.GetResultBoundaryRects(boundaryRects);

// 결과를 윤곽 도형으로 얻어오기
CFLFigureArray boundaryContours;
blob.GetResultContours(boundaryContours);
CBlob blob = new CBlob();
//////////////////////////////////
// 공통 파라미터 설정
//////////////////////////////////

//////////////////////////////////
// 추가 옵션 설정
//////////////////////////////////

blob.SetThreshold(180);
blob.SetLogicalCondition(ELogicalCondition.Less);
blob.Execute();

// 넓이가 100 이하인 객체 제거
blob.Filter(CBlob.EFilterItem.Area, 100.0, ELogicalCondition.LessEqual);

// 둘레를 기준으로 정렬
blob.Sort(CBlob.EFilterItem.Perimeter, CBlob.EOrder.Ascending);

// 결과를 경계 사각형으로 얻어오기
CFLFigureArray boundaryRects = new CFLFigureArray();
blob.GetResultBoundaryRects(ref boundaryRects);

// 결과를 윤곽 도형으로 얻어오기
CFLFigureArray boundaryContours = new CFLFigureArray();
blob.GetResultContours(ref boundaryContours);
blob = CBlob()
######################
# 공통 파라미터 설정
######################

######################
# 추가 옵션 설정
######################

blob.SetThreshold(180)
blob.SetLogicalCondition(ELogicalCondition.Less)
blob.Execute()

# 넓이가 100 이하인 객체 제거
blob.Filter(CBlob.EFilterItem.Area, 100.0, ELogicalCondition.LessEqual)

# 둘레를 기준으로 정렬
blob.Sort(CBlob.EFilterItem.Perimeter, CBlob.EOrder.Ascending)

# 결과를 경계 사각형으로 얻어오기
boundaryRects = CFLFigureArray()
blob.GetResultBoundaryRects(boundaryRects)

# 결과를 윤곽 도형으로 얻어오기
boundaryContours = CFLFigureArray()
blob.GetResultContours(boundaryContours)

5 관련 알고리즘

CBlobSubsampled