반응형
250x250
Notice
Recent Posts
Recent Comments
Link
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

폴크(FOLC)

치수 계산하기 - robust edge detection 3 본문

카테고리 없음

치수 계산하기 - robust edge detection 3

folcjin 2025. 6. 21. 19:50
728x90
반응형

Bayesian Edge Detection for 1D Signal은 확률 기반의 접근법을 사용하여 신호 내 변화점(에지)을 탐지하는 알고리즘입니다. 신호에 포함된 노이즈를 통계적으로 고려하면서 에지를 더 정밀하게 검출할 수 있다는 장점이 있습니다.

 

Bayesian Edge Detection
- 에지는 신호의 통계적 특성이 바뀌는 지점으로 간주됩니다.
- 신호의 각 세그먼트는 고유한 분포(예: 정규 분포)를 갖는다고 가정합니다.
- 주어진 신호의 구간을 두 개의 구간으로 나누었을 때,
= 이 구간들이 각각 서로 다른 분포에서 나왔을 확률이 높은 위치가 에지로 판단됩니다.
= 이 확률을 계산하기 위해 Bayes Rule과 **사후 확률(posteriors)**을 사용합니다.

 

알고리즘 수행 순서
1. 입력 신호를 반복하면서 가능한 모든 분할 위치 ii에 대해:
 - 양쪽 구간의 평균과 분산 계산
 - 각 구간의 정규분포 기반 log-likelihood 계산
2. log-likelihood의 합이 최대가 되는 위치 ii를 에지로 선택
3. 필요 시 multi-edge 탐지를 위해 재귀적으로 처리

 

예제

#include <iostream>
#include <vector>
#include <cmath>
#include <limits>

using namespace std;

// 정규분포의 log-likelihood 계산
double computeLogLikelihood(const vector<double>& data, int start, int end) {
    int n = end - start + 1;
    if (n <= 1) return -std::numeric_limits<double>::infinity();

    double sum = 0, sq_sum = 0;
    for (int i = start; i <= end; ++i) {
        sum += data[i];
        sq_sum += data[i] * data[i];
    }

    double mean = sum / n;
    double var = (sq_sum - n * mean * mean) / n;

    if (var <= 1e-8) return -std::numeric_limits<double>::infinity();

    // 정규분포의 log-likelihood (정규화 상수 포함)
    double log_likelihood = -0.5 * n * (log(2 * M_PI * var) + 1);
    return log_likelihood;
}

// Bayesian Edge Detection
int detectEdge(const vector<double>& signal) {
    int N = signal.size();
    double max_log_likelihood = -std::numeric_limits<double>::infinity();
    int best_edge = -1;

    // 가능한 모든 분할 위치 탐색
    for (int i = 1; i < N - 1; ++i) {
        double ll_left = computeLogLikelihood(signal, 0, i);
        double ll_right = computeLogLikelihood(signal, i + 1, N - 1);
        double total_ll = ll_left + ll_right;

        if (total_ll > max_log_likelihood) {
            max_log_likelihood = total_ll;
            best_edge = i;
        }
    }

    return best_edge;
}

int main() {
    vector<double> signal = {1.0, 1.1, 0.9, 1.2, 1.0, 5.2, 5.0, 4.9, 5.1, 5.3};

    int edge_index = detectEdge(signal);
    cout << "Detected Edge at index: " << edge_index << endl;

    return 0;
}

728x90
반응형
사업자 정보 표시
사업자 등록번호 : -- | TEL : --