히스토그램처럼 균일한 간격으로 주어진 데이터에서 피크 값의 위치를 찾기 위해서는 먼저 노이즈 제거를 위해 몇 번의 smoothing 과정을 적용해야 한다 (구체적인 방법은 필요에 따라 다양하다). smoothing 과정을 거친 히스토그램에서 피크 위치를 찾는 것은 쉬운 작업이다. 그런데 경우에 따라 그 위치를 sub-order까지 구해야 필요가 생긴다. 예를 들면, 실수 값 데이터 시퀀스 대한 히스토그램을 만들려면 먼저 정수로 양자화시켜야 가능하다. 이 양자화된 정보를 담고 있는 히스토그램에서 피크의 위치를 찾으려 할 때 양자화 과정에서 잃어버린 정밀도를 복원하려면 interpolation을 써야 한다. 간단하게 parabolic 근사로 피크의 위치를 찾는 경우를 생각하자. 이 방법은 수학적으로 단순하지만 영상처리 알고리즘에서 많이 이용이 되고 있다. 데이터 시퀀스가 균일한 간격에서 주어졌으므로 계산은 $-1, 0, 1$의 세 군데 위치에서 중앙 근방에 피크가 나타나는지를 고려하면 된다. 세 점에서 히스토그램 값이 각각 $h_m, h_0, h_p$일 때 이들을 지나는 이차 곡선의 피크 위치를 찾자. 주어진 이차 곡선을
$$y = a (x - c)^2 + b$$
꼴로 쓰면 $c$가 0에서 벗어난 정도를 나타낸다.
$$(-1, h_m) \quad \rightarrow \quad h_m = a(-1-c)^2 +b; \\(0, h_0) \quad \rightarrow \quad h_0 = a c^2 +b; \\ (+1, h_p) \quad \rightarrow \quad h_m = a(+1-c)^2 +b; $$ 이므로 $$h_m - h_p = 4ac, \\ h_m + h_p -2 h_0=2 a,\\ \therefore ~c = \frac { h_m - h_p}{2(h_m + h_p -2 h_0 )}$$
아래 코드는 피크의 위치가 중앙점에서 벗어난 정도를 준다.
bool parabolicInterpolate(double hm, double h0, double hp, double *c) {
double a = hm + hp - 2 * h0;
if (a >= 0) return false; // not a parabola(a==0), not convex up(a>0);
*c = 0.5 * (hm - hp) / a;
if (*c < -0.5 || *c > 0.5) return false; // too far;
return true;
}
'Image Recognition > Fundamental' 카테고리의 다른 글
Least Squares Fitting of Circles (0) | 2020.11.11 |
---|---|
Integer Sqrt (0) | 2020.11.11 |
Histogram Matching (0) | 2012.11.03 |
삼각형의 외접원: 외접원의 중심 2 (9) | 2012.10.20 |
삼각형의 외접원: 외접원의 중심 (0) | 2012.10.19 |