| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- Encapusulation
- Pointer
- aduino
- parameter
- public
- SERIAL
- c++
- digitalRead
- atmega328
- memory
- Binary
- Gaussian
- flutter
- Gradient
- Unity
- file access
- Android
- compare
- wpf
- subpixel
- Read
- mfc
- UNO
- edge
- APP
- sensor
- Filtering
- stream
- Contour
- Class
- Today
- Total
폴크(FOLC)
치수 계산하기 - robust edge detection 3 본문
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;
}