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

C# OpenCvSharp을 이용한 최소제곱법 설명 및 구현

by tasiklee 2025. 2. 18.

1. 최소제곱법이란?

최소제곱법(Least Squares Method)은 주어진 데이터 집합에 가장 적합한 선형 또는 비선형 함수를 찾는 수학적 기법입니다. 이는 데이터 포인트들 사이의 오차를 최소화하여 최적의 곡선을 구하는 데 사용됩니다.

OpenCvSharp을 이용하면 이미지 처리와 컴퓨터 비전 응용에서 최소제곱법을 효과적으로 활용할 수 있습니다. 본 포스트에서는 C#과 OpenCvSharp을 이용하여 최소제곱법을 구현하는 방법을 설명하겠습니다.


2. 최소제곱법의 수학적 원리

최소제곱법은 주어진 데이터 집합 에 대해 다음과 같은 1차 방정식 을 찾는 과정입니다.

📌 수식 유도

오차 함수는 다음과 같이 정의됩니다.

이 함수를 미분하여 최솟값을 찾으면 다음과 같은 공식이 도출됩니다.

이 공식을 이용하여 최소제곱법을 적용할 수 있습니다.


3. C# OpenCvSharp을 이용한 최소제곱법 구현

📌 코드 구현

using System;
using System.Collections.Generic;
using OpenCvSharp;

class LeastSquares
{
    public static (double a, double b) ComputeLeastSquares(List<Point2d> points)
    {
        int n = points.Count;
        double sumX = 0, sumY = 0, sumXY = 0, sumX2 = 0;

        foreach (var p in points)
        {
            sumX += p.X;
            sumY += p.Y;
            sumXY += p.X * p.Y;
            sumX2 += p.X * p.X;
        }

        double a = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX);
        double b = (sumY - a * sumX) / n;

        return (a, b);
    }

    static void Main()
    {
        List<Point2d> points = new List<Point2d>
        {
            new Point2d(1, 2),
            new Point2d(2, 2.8),
            new Point2d(3, 3.6),
            new Point2d(4, 4.5),
            new Point2d(5, 5.1)
        };

        var (a, b) = ComputeLeastSquares(points);
        Console.WriteLine($"최소제곱법 회귀선: y = {a:F2}x + {b:F2}");
    }
}

🔍 코드 설명

  • ComputeLeastSquares() 메서드는 주어진 점 리스트에서 최소제곱법을 적용하여 기울기 a와 절편 b를 계산합니다.
  • Main()에서 샘플 데이터를 사용하여 회귀선을 구하고 출력합니다.

4. 최소제곱법의 활용

📌 주요 응용 분야

  • 데이터 분석: 주어진 데이터의 추세를 분석하는 데 유용함.
  • 이미지 처리: 엣지 검출 후 직선 피팅(line fitting)에 사용됨.
  • 기계 학습: 선형 회귀 모델을 학습할 때 기본적인 방법으로 활용됨.

📌 OpenCvSharp에서 활용 가능성

  • 직선 검출: Cv2.FitLine() 함수를 이용하면 이미지 상의 점 집합에서 최적의 직선을 찾을 수 있음.
  • 3D 좌표 변환: 여러 포인트를 기반으로 최적의 변환 모델을 찾는 데 사용됨.

5. 결론

이번 포스트에서는 C#과 OpenCvSharp을 이용하여 최소제곱법을 구현하는 방법을 설명했습니다. 최소제곱법은 데이터 분석과 컴퓨터 비전에서 중요한 역할을 하며, OpenCvSharp을 이용하면 보다 직관적으로 적용할 수 있습니다.

추후 포스트에서는 OpenCvSharp의 FitLine()을 이용한 직선 검출 방법을 다룰 예정이니, 많은 관심 부탁드립니다! 🚀