본문 바로가기
카테고리 없음

C# OpenCVSharp을 활용한 이진화, Edge 검출, 그리고 Blob을 이용한 Data 추출

by tasiklee 2025. 2. 25.

이미지 처리에서 중요한 기술 중 하나는 특정 객체나 경계를 인식하고 필요한 데이터를 추출하는 것입니다. OpenCVSharp을 활용하면 C#에서 OpenCV의 강력한 기능을 쉽게 사용할 수 있습니다.

본 포스트에서는 이진화(Binary Thresholding), 엣지 검출(Edge Detection), 그리고 Blob 분석을 통한 데이터 추출 방법을 설명하겠습니다.


1. OpenCVSharp 설치

C#에서 OpenCV를 사용하려면 OpenCVSharp 라이브러리를 활용하면 됩니다. OpenCVSharp은 OpenCV의 C++ API를 C#에서 쉽게 사용할 수 있도록 래핑한 라이브러리입니다.

설치 방법

  1. Visual Studio에서 NuGet 패키지 관리자를 엽니다.
  2. 다음 패키지를 검색하여 설치합니다. 
  3. nstall-Package OpenCvSharp4
    Install-Package OpenCvSharp4.Windows
  4. 설치가 완료되면 프로젝트에서 OpenCV 기능을 사용할 수 있습니다.

2. 이미지 이진화 (Binary Thresholding)

이진화는 이미지를 흑백으로 변환하는 과정입니다. 특정 임계값을 기준으로 픽셀을 검은색(0) 또는 흰색(255)으로 변환합니다.

C# 코드 예제

using System;
using OpenCvSharp;

class Program
{
    static void Main()
    {
        // 이미지 로드 (흑백 변환)
        Mat image = Cv2.ImRead("sample.jpg", ImreadModes.Grayscale);

        if (image.Empty())
        {
            Console.WriteLine("이미지를 불러올 수 없습니다.");
            return;
        }

        // 이진화 적용 (임계값: 127, 최대값: 255)
        Mat binaryImage = new Mat();
        Cv2.Threshold(image, binaryImage, 127, 255, ThresholdTypes.Binary);

        // 결과 이미지 저장 및 출력
        Cv2.ImWrite("binary.jpg", binaryImage);
        Cv2.ImShow("Binary Image", binaryImage);
        Cv2.WaitKey(0);
    }
}

설명

  1. Cv2.ImRead("sample.jpg", ImreadModes.Grayscale)를 사용하여 이미지를 흑백으로 로드합니다.
  2. Cv2.Threshold()를 사용하여 임계값 127을 기준으로 이진화를 수행합니다.
  3. 결과를 Cv2.ImWrite()를 이용해 저장하고, Cv2.ImShow()로 화면에 출력합니다.

3. 엣지 검출 (Edge Detection)

엣지 검출은 이미지에서 윤곽선을 감지하는 방법입니다. 가장 많이 사용되는 방식은 Canny Edge Detection 알고리즘입니다.

C# 코드 예제

using System;
using OpenCvSharp;

class Program
{
    static void Main()
    {
        // 이미지 로드 (흑백 변환)
        Mat image = Cv2.ImRead("sample.jpg", ImreadModes.Grayscale);

        if (image.Empty())
        {
            Console.WriteLine("이미지를 불러올 수 없습니다.");
            return;
        }

        // 가우시안 블러 적용 (노이즈 제거)
        Cv2.GaussianBlur(image, image, new Size(5, 5), 1.5);

        // Canny Edge Detection
        Mat edges = new Mat();
        Cv2.Canny(image, edges, 50, 150);

        // 결과 저장 및 출력
        Cv2.ImWrite("edges.jpg", edges);
        Cv2.ImShow("Edges", edges);
        Cv2.WaitKey(0);
    }
}

설명

  1. 이미지를 흑백으로 변환한 후 Cv2.GaussianBlur()를 사용하여 노이즈를 제거합니다.
  2. Cv2.Canny()를 사용하여 Canny Edge Detection을 수행합니다.
  3. Cv2.ImWrite() 및 Cv2.ImShow()를 이용하여 결과를 확인합니다.

4. Blob을 이용한 데이터 추출

Blob(Blob Detection)은 이미지에서 연결된 객체(Connected Components) 를 감지하는 기법입니다. 특정 색상이나 모양을 가진 객체를 식별하는 데 사용됩니다.

C# 코드 예제

using System;
using OpenCvSharp;

class Program
{
    static void Main()
    {
        // 이미지 로드 (흑백 변환)
        Mat image = Cv2.ImRead("sample.jpg", ImreadModes.Grayscale);

        if (image.Empty())
        {
            Console.WriteLine("이미지를 불러올 수 없습니다.");
            return;
        }

        // 이진화 적용
        Mat binaryImage = new Mat();
        Cv2.Threshold(image, binaryImage, 100, 255, ThresholdTypes.Binary);

        // 연결된 컴포넌트(Blob) 분석
        Mat labels = new Mat();
        Mat stats = new Mat();
        Mat centroids = new Mat();
        int numLabels = Cv2.ConnectedComponentsWithStats(binaryImage, labels, stats, centroids);

        Console.WriteLine($"총 Blob 개수: {numLabels - 1}"); // 배경 제외

        // 결과 이미지 생성
        Mat output = new Mat();
        Cv2.CvtColor(binaryImage, output, ColorConversionCodes.GRAY2BGR);

        for (int i = 1; i < numLabels; i++)
        {
            int x = stats.At<int>(i, 0);
            int y = stats.At<int>(i, 1);
            int width = stats.At<int>(i, 2);
            int height = stats.At<int>(i, 3);
            int area = stats.At<int>(i, 4);

            // Blob 크기 출력
            Console.WriteLine($"Blob {i}: 위치=({x},{y}), 크기=({width}x{height}), 면적={area}");

            // 경계 박스 그리기
            Cv2.Rectangle(output, new Rect(x, y, width, height), new Scalar(0, 0, 255), 2);
        }

        // 결과 저장 및 출력
        Cv2.ImWrite("blob_output.jpg", output);
        Cv2.ImShow("Blob Detection", output);
        Cv2.WaitKey(0);
    }
}

설명

  1. 이미지를 흑백으로 변환한 후 이진화(Thresholding)를 적용합니다.
  2. Cv2.ConnectedComponentsWithStats()를 사용하여 Blob(연결된 객체)을 감지합니다.
  3. 감지된 객체의 위치(x, y), 크기(width, height), 면적(area) 정보를 출력합니다.
  4. 각 Blob에 사각형을 그려 강조한 후 결과를 저장하고 출력합니다.

5. 정리

기능코드 방식

이진화(Binary Thresholding) Cv2.Threshold()
엣지 검출(Canny Edge Detection) Cv2.Canny()
Blob 검출 및 데이터 추출 Cv2.ConnectedComponentsWithStats()

위 기법들을 조합하면 영상 속 특정 영역의 데이터를 감지하고 분석할 수 있습니다. 예를 들어, 이미지 내 사물 개수를 세거나, 특정 물체의 크기와 위치를 찾을 수 있습니다.


추가 질문이 있다면 댓글로 남겨주세요! 😊