C# OpenCV 강좌 : 제 32강 - Blob 라벨링

C# OpenCV Blob Labeling

C# OpenCV 강좌 : 제 32강 - Blob 라벨링
[ C#-OpenCvSharp2 ] - 윤대희

라벨링(Labeling)


1 영상이나 이미지에서 인접한 화소들을 묶어 하나의 객체로 판단하는 방식입니다.

즉, 인접한(연결된) 화소끼리 같은 번호를 부여합니다. 여러 물체를 구분하기 위해서 사용합니다. 라벨링 또는 레이블링이라 부릅니다.


원본(Source, src)를 영상이나 이미지를 사용하면 됩니다.

영상 사용하기 : 3강 바로가기

이미지 사용하기 : 4강 바로가기



Class


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;
using OpenCvSharp.Blob;

namespace test
{
    class OpenCV : IDisposable
    {  
        IplImage bin;
        IplImage blob;
    
        public IplImage Binary(IplImage src)
        {
            bin = new IplImage(src.Size, BitDepth.U8, 1);
            Cv.CvtColor(src, bin, ColorConversion.BgrToGray);
            Cv.Threshold(bin, bin, 50, 255, ThresholdType.Binary);

            return bin;
        }
            
        public IplImage BlobImage(IplImage src)
        {
            blob = new IplImage(src.Size, BitDepth.U8, 3);
            bin = this.Binary(src);
            
            CvBlobs blobs = new CvBlobs();
            blobs.Label(bin);

            blobs.RenderBlobs(src, blob);

            foreach (KeyValuePair<int, CvBlob> item in blobs)
            {
                CvBlob b = item.Value;
               
                blob.PutText(Convert.ToString(b.Label), b.Centroid, new CvFont(FontFace.HersheyComplex, 1, 1), CvColor.Red);
            }

            return blob;
        }
                   
        public void Dispose()
        {
            if (bin != null) Cv.ReleaseImage(bin);
            if (blob != null) Cv.ReleaseImage(blob);
        }
    }
}



Class Code


using OpenCvSharp.Blob;

CvBlobs 함수를 사용하기 위해서는 네임스페이스using OpenCvSharp.Blob;를 선언해야 사용할 수 있습니다.


blob = new IplImage(src.Size, BitDepth.U8, 3);
bin = this.Binary(src);

bin라벨링에 사용될 이미지입니다. 이 이미지를 통하여 라벨링을 진행합니다. 라벨링은 이진화 이미지를 사용합니다.


CvBlobs blobs = new CvBlobs();
blobs.Label(bin);

CvBlobs blobs = new CvBlobs();을 이용하여 라벨링을 하기 위해 생성자를 만듭니다.

blobs.Label(bin);를 통하여 라벨링을 진행합니다. 이진화 이미지를 사용합니다.


blobs.RenderBlobs(src, blob);

blobs.RenderBlobs(원본, 결과);를 통하여 라벨링 결과를 확인할 수 있습니다.


foreach (KeyValuePair<int, CvBlob> item in blobs)
{
    CvBlob b = item.Value;
   
    blob.PutText(Convert.ToString(b.Label), b.Centroid, new CvFont(FontFace.HersheyComplex, 1, 1), CvColor.Red);
}

foreach문을 이용하여 라벨링 정보를 확인할 수 있습니다. item값을 이용하여 라벨링 정보를 확인 가능합니다.

아래의 목록을 foreach문에 사이에 삽입하여 라벨링 번호에 따른 데이터를 확인 할 수 있습니다.

  • 라벨링 번호 : b.Label
  • 중심점 : b.Centroid
  • 면적(moment 00) : b.Area
  • 등고선 각도 : b.Angle() / Math.PI * 180
  • 사각형 정보 : b.Rect
  • 라벨링의 시작 위치 : b.Contour.StartingPoint



라벨링 부여 방식


2 라벨링은 좌측 상단부터 우측 상단방향으로 이동해가면서 파악합니다.

가장 첫 줄의 파악이 끝나면 다음 줄 좌측 부터 우측방향으로 마지막 픽셀까지 파악합니다.

파악 중 가장 처음 만나는 픽셀이 라벨링 번호 1번이며 그 픽셀과 인접한 픽셀들을 모두 같은 번호를 부여하게됩니다.



3 위의 이미지에서 하얀색 원이 라벨링이 부여되는 시작 위치입니다.

좌측 상단부터 시작하면 076923의 이미지에서 0을 가장 처음 만나게 되고, 다음은 7이 아닌 6을 만나게 됩니다.

이후, 순서대로 923을 만나게 되며 마지막으로 7을 만나게 됩니다. 즉 라벨링 순서는 069237이 되게됩니다.



4 위의 이미지에서 붉은 색으로 된 라벨링 번호를 확인 할 수 있습니다.



Result


5



Book Image

개정판이 출간됐습니다!

C#과 파이썬을 활용한 OpenCV 4 프로그래밍 (개정판)

컴퓨터 비전 기초 이론부터 머신러닝을 활용한 영상 처리 프로젝트까지

  • C#과 파이썬용 OpenCV의 데이터 형식과 행렬 및 배열 연산
  • 이미지/동영상/카메라를 활용한 입출력과 결과 저장
  • 전처리 과정과 정보를 탐색하기 위한 이미지 변형
  • 유의미한 정보를 검출하기 위한 이미지 변환
  • 이미지에서 정보를 검출 및 인식
  • 객체 검출을 포함한 모션 추적
  • K-means, KNN, SVM 등의 머신러닝 알고리즘 적용 방법
  • 카페(Caffe), 다크넷(Darknet), 텐서플로 모델을 활용한 딥러닝 모듈 적용 방법
  • Tesseract-OCR과 C# OpenCvSharp4를 활용한 프로젝트
  • 텐서플로와 Python OpenCV4를 활용한 프로젝트
  • 윤대희 저 | 위키북스

    [yes24 바로가기] [알라딘 바로가기] [교보문고 바로가기]

    후원하기


    ⤧  Previous post C# OpenCV 강좌 : 제 31강 - 이진화 메소드 ⤧  Next post C# OpenCV 강좌 : 제 33강 - Blob 윤곽선 검출
    C#-OpenCvSharp2 Category