C# OpenCV 강좌 : 제 32강 - Blob 라벨링
라벨링(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
이 되게됩니다.
위의 이미지에서 붉은 색으로 된 라벨링 번호를 확인 할 수 있습니다.
출력 결과
공유하기


댓글 남기기