컴퓨터 비전(이미지 스티칭 요약 3)

머리말

제가 주는 제목마다 조금씩 다른 것 같네요... 뭐 일단은 잊어버리고 이번 글에서 설명할 내용은 특징점 매칭 부분입니다!!!

텍스트

이론

특징점 매칭 알고리즘은 꽤 많은데 선생님께서 주로 두 가지 알고리즘에 대해 말씀하셨을 텐데요, 하나는 최소자승법이고 다른 하나는 RANSAC 알고리즘입니다. 이전 알고리즘에 대해서는 자세히 설명하지 않겠습니다. RANSAC 알고리즘:

먼저 간략한 소개를 하자면 다음과 같습니다.

RANSAC(Random Sample Consensus)는 모델 매개변수를 강건하게 추정하기 위한 알고리즘으로, 컴퓨터 비전 및 이미지 처리 분야, 특히 특징점 매칭, 이미지 접합, 대상 인식 등의 작업에서 널리 사용됩니다. RANSAC의 주요 특징은 노이즈와 이상값이 많은 데이터 세트에서 최적의 모델 매개변수를 강력하게 추정하는 능력입니다.

RANSAC 알고리즘의 기본 단계는 다음과 같습니다.

1. **임의 샘플링:** 데이터 세트에서 최소 샘플 세트를 무작위로 선택하고 이 샘플을 사용하여 모델 매개변수를 추정합니다.

2. **모델 피팅:** 선택한 모델(선, 평면, 다항식 등)을 사용하여 선택한 샘플을 피팅하여 모델을 얻습니다.

3. **인라이어 테스트:** 모든 데이터 포인트와 피팅된 모델 사이의 거리를 계산하고, 임계값보다 작은 거리의 포인트를 인라이어(모델을 준수하는 포인트)로 표시하고 다른 포인트를 아웃라이어(아웃라이어)로 표시합니다. .

4. **모델 평가:** 내부 점 수(적합도)를 계산합니다. 내부 점이 많을수록 모델이 좋아집니다.

5. **반복:** 1~4단계를 정해진 횟수만큼 반복하고 매번 내부 점이 가장 많은 모델을 선택합니다.

6. **최적 모델:** 인라이어가 가장 많은 모델이 최종 추정을 위한 모델로 선택됩니다.

RANSAC의 장점은 노이즈와 이상값이 포함된 데이터 세트를 처리할 수 있다는 것입니다. 무작위 표본추출로 인해 이상값이 포함되지 않은 표본 집합을 선택할 확률이 일정하므로 더 나은 모델을 얻을 수 있습니다. 이후 반복을 통해 모델이 지속적으로 최적화되고 최종적으로 더욱 견고한 결과를 얻게 됩니다.

RANSAC 알고리즘을 적용할 때 일반적으로 데이터 포인트를 수학적 모델에 맞추는 문제를 해결합니다. 이 모델은 문제의 성격에 따라 선형, 다항식, 평면 또는 더 복잡한 모델이 될 수 있습니다. RANSAC의 각 단계의 수학적 원리를 자세히 설명하기 위해 직선 피팅을 예로 들어 보겠습니다.

**1. 무작위 샘플링:** 직선 피팅 문제에서는 두 개의 서로 다른 데이터 포인트를 무작위로 선택한 다음 이 두 포인트를 사용하여 직선의 방정식을 결정합니다. 우리가 선택한 두 점을 $(x_1, y_1)$과 $(x_2, y_2)$라고 가정하면 직선의 방정식은 $y = mx + b$로 표현될 수 있습니다. 여기서 $m$은 기울기이고 $b$는 절편입니다. 2점 공식에 따르면 기울기 $m$과 절편 $b$의 표현식을 얻을 수 있습니다.

**2. 모델 피팅:** 선택한 두 점을 사용하여 직선의 방정식을 구합니다.

**3. 내부 점 테스트:** 모든 데이터 점과 피팅된 직선 사이의 거리를 계산하고 거리가 임계값보다 작은 점은 이상점으로 표시하고 다른 점은 이상점으로 표시합니다. 직선을 맞추는 방정식은 $y = mx + b$이며, 데이터 포인트 $(x_i, y_i)$에서 직선까지의 거리는 다음과 같이 표현할 수 있습니다.

여기서 분모는 직선의 기울기가 $m$이므로 법선 벡터가 $(m, -1)$이기 때문입니다. 거리 계산 공식은 실제로 점에서 직선까지의 거리 공식입니다.

**4. 모델 평가:** 내부 점 수를 계산합니다. 내부 포인트가 많을수록 핏이 좋아집니다.

**5. 반복:** 1~4단계를 정해진 횟수만큼 반복합니다. 각 반복에서는 직선에 맞게 두 개의 서로 다른 임의 점을 선택하고 내부 점 수를 계산합니다.

**6. 최적 모델:** 내부 점이 가장 많은 직선을 최종 추정 모델로 선택합니다.

RANSAC의 모든 단계에서 수학적 원리는 기본 기하학과 대수학 지식을 기반으로 하지만 RANSAC의 힘은 알고리즘이 노이즈와 이상값이 포함된 데이터 세트에서 최적의 피팅 모델을 찾을 수 있도록 하는 무작위 샘플링 및 반복 전략에 있습니다.

암호

간단한 코드 예:

import numpy as np
import matplotlib.pyplot as plt

# 生成带有噪声的数据
np.random.seed(0)
num_points = 100
noise = np.random.normal(loc=0, scale=10, size=num_points)
x = np.linspace(0, 100, num_points)
y = 3 * x + 2 + noise

# 添加一些异常值
num_outliers = 20
outliers_x = np.random.randint(0, num_points, num_outliers)
outliers_y = np.random.randint(0, 200, num_outliers)
y[outliers_x] = outliers_y

# 使用RANSAC算法拟合直线
def ransac_line_fit(x, y, threshold=10, max_iterations=100):
    best_line = None
    best_inliers = np.array([])

    for _ in range(max_iterations):
        random_indices = np.random.choice(len(x), 2, replace=False)
        sample_x = x[random_indices]
        sample_y = y[random_indices]

        # 计算直线参数
        A = np.vstack([sample_x, np.ones(len(sample_x))]).T
        m, b = np.linalg.lstsq(A, sample_y, rcond=None)[0]

        # 计算所有点到拟合直线的距离
        distances = np.abs(y - (m * x + b))

        # 判断内点
        inliers = (distances < threshold)

        # 更新最佳模型
        if np.sum(inliers) > np.sum(best_inliers):
            best_inliers = inliers
            best_line = (m, b)

    return best_line

best_line_m, best_line_b = ransac_line_fit(x, y, threshold=15, max_iterations=100)

# 绘制原始数据和拟合直线
plt.scatter(x, y, label='Data points', color='blue', alpha=0.6)
plt.scatter(x[best_inliers], y[best_inliers], label='Inliers', color='green', alpha=0.8)
plt.plot(x, best_line_m * x + best_line_b, color='red', linewidth=3, label='RANSAC line')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()

결론

어업...

Guess you like

Origin blog.csdn.net/m0_73872315/article/details/134186799