상위 목록: 하위 목록: 작성 날짜: 읽는 데 12 분 소요

라벨링(Labeling)

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

즉, 인접한(연결된) 화소끼리 같은 번호를 부여합니다.

여러 물체를 구분하기 위해서 사용합니다.

라벨링 또는 레이블링이라 부릅니다.

원본(Source, src)은 영상이나 이미지를 사용합니다.



클래스 코드

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

namespace Project
{
    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);
        }
    }
}


세부 코드

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



라벨링 부여 방식

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

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

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


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

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

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


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



출력 결과

댓글 남기기