이미지 처리에서 중요한 기술 중 하나는 특정 객체나 경계를 인식하고 필요한 데이터를 추출하는 것입니다. OpenCVSharp을 활용하면 C#에서 OpenCV의 강력한 기능을 쉽게 사용할 수 있습니다.
본 포스트에서는 이진화(Binary Thresholding), 엣지 검출(Edge Detection), 그리고 Blob 분석을 통한 데이터 추출 방법을 설명하겠습니다.
1. OpenCVSharp 설치
C#에서 OpenCV를 사용하려면 OpenCVSharp 라이브러리를 활용하면 됩니다. OpenCVSharp은 OpenCV의 C++ API를 C#에서 쉽게 사용할 수 있도록 래핑한 라이브러리입니다.
설치 방법
- Visual Studio에서 NuGet 패키지 관리자를 엽니다.
- 다음 패키지를 검색하여 설치합니다.
-
nstall-Package OpenCvSharp4 Install-Package OpenCvSharp4.Windows
- 설치가 완료되면 프로젝트에서 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);
}
}
설명
- Cv2.ImRead("sample.jpg", ImreadModes.Grayscale)를 사용하여 이미지를 흑백으로 로드합니다.
- Cv2.Threshold()를 사용하여 임계값 127을 기준으로 이진화를 수행합니다.
- 결과를 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);
}
}
설명
- 이미지를 흑백으로 변환한 후 Cv2.GaussianBlur()를 사용하여 노이즈를 제거합니다.
- Cv2.Canny()를 사용하여 Canny Edge Detection을 수행합니다.
- 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);
}
}
설명
- 이미지를 흑백으로 변환한 후 이진화(Thresholding)를 적용합니다.
- Cv2.ConnectedComponentsWithStats()를 사용하여 Blob(연결된 객체)을 감지합니다.
- 감지된 객체의 위치(x, y), 크기(width, height), 면적(area) 정보를 출력합니다.
- 각 Blob에 사각형을 그려 강조한 후 결과를 저장하고 출력합니다.
5. 정리
기능코드 방식
이진화(Binary Thresholding) | Cv2.Threshold() |
엣지 검출(Canny Edge Detection) | Cv2.Canny() |
Blob 검출 및 데이터 추출 | Cv2.ConnectedComponentsWithStats() |
위 기법들을 조합하면 영상 속 특정 영역의 데이터를 감지하고 분석할 수 있습니다. 예를 들어, 이미지 내 사물 개수를 세거나, 특정 물체의 크기와 위치를 찾을 수 있습니다.
추가 질문이 있다면 댓글로 남겨주세요! 😊