이미지의 히스토그램을 이용하여 전경과 배경을 분리하는 이진화는 가우시안 mixture model과 EM 알고리즘을 적용하기에 좋은 예다. 히스토그램에는 전경에 해당하는 픽셀 분포와 배경에 해당하는 픽셀 분포가 혼합되어 있다. 이를 두 가우시안의 혼합으로 모델링하고 EM 알고리즘을 사용해서 mixing parameter(πa), 각 클래스의 평균(μa) 과 표준편차(σa)를 추정한다. $N$개의 Gaussian mixture일 때,
$$\text{Mixture Model:}~~h(x) = \sum_a \pi_a g_a(x)~~~~\Big(\sum _a \pi_a=1\Big)$$
$$\text{Gaussian Mixture:}~~g_a(x) = \phi( x| \theta_a)~~~~~\theta_a =N(\mu_a , \sigma_a^2) $$
Mixing parameter가 πa $(a=1, 2,..., nclass)$일 때 특정 픽셀 값(=$x_i$)이 클래스 $a$ 소속일 posterior는
$$\text{Posterior:}~~~\gamma_{i,a} \equiv Pr( Z_i =a| x_i, \Theta) = \frac{\pi_a \phi (x_i | \theta_a)}{ \sum_b \pi_b \phi(x_i | \theta_b) }$$
로 쓸 수 있다. posterior 정보를 이용하면 mixing parameter, 평균 그리고 분산은 다음 식으로 주어진다. $H[i] = H_i$는 이미지의 히스토그램을 나타내고, bin 인덱스 $i$는 픽셀 값 $x_i$를 나타낸다. 그러면
$$\pi_a = \frac{\sum_i H_i \gamma_{i, a}}{\sum_k H_k }$$
$$\mu_a = \frac{\sum_i x_i H_i \gamma_{i, a} }{\sum_k H_k \gamma_{k,a}}$$
$$\sigma_a^2 = \frac{\sum_i (x_i - \mu_a) ^2 H_i \gamma_{i,a}}{\sum_k H_k \gamma_{k,a}}$$
log-likelihood:
$$\log (L) = \sum _i \log \Big[\sum_a \pi_a \phi( x_i | \theta_a) \Big]$$
// mixing 클래스를 기술하는 클래스;
struct mixclass {
double prob ; // mixing parameter;
double mean ; // mean
double var ; // variance;
};
double gauss1d(double x, double mean, double var)
{
double a = 1 / sqrt(2*M_PI * var);
double b = 0.5*(x-mean)*(x-mean)/var;
return a * exp(-b);
};
// posterior; Pr(Zi = c | xi, Theta);
// 주어진 관측값 x이 클래스 cid에 속할 posterior;
double classprob(double x, int nclass, mixclass* mclass, int cid)
{
{
// 입력은 이미지의 히스토그램;
double em(int nbins/*=256*/, double hist[/*256*/],
int nclass/*=2*/, mixclass mclass[/*=2*/], double eps/*=1.e-10*/) {
double llk = 0, prev_llk = 0;
// allocate memory buffers for the posterior information;
double ** class_prob = (double**)malloc(sizeof(double*) * nbins);
class_prob[0] = (double*)malloc(sizeof(double) * nbins * nclass) ;
for (int i = 1; i < nbins; i++) class_prob[i] = class_prob[i - 1] + nclass;
// initialization of algorithm;
init_em(nbins, hist, nclass, mclass);
//
do {
prev_llk = llk;
// E-step ;
update_class_prob(nbins, hist, nclass, mclass, class_prob);
// M-step;
update_parameters(nbins, hist, nclass, mclass, class_prob);
llk = mixLLK(nclass, mclass);
// TRACE("mean1=%f, mean2=%f\n", mclass[0].mean, mclass[1].mean);
TRACE("log-likelihood=%e\n", llk);
} while (!check_tol(llk, prev_llk, eps));
// clean ;
free(class_prob[0]);
free(class_prob) ;
return llk;
};
- 적색 : 히스토그램
- 청색, 녹색 : posterior(membership);
- Otsu 알고리즘을 쓰는 경우에 100에서 threshold 값이 결정되고 EM은 110 정도임.
- Otsu Threshold source code: kipl.tistory.com/17
'Image Recognition' 카테고리의 다른 글
| KMeans Algorithm (0) | 2008.07.19 |
|---|---|
| Robust Line Fitting (0) | 2008.07.08 |
| EM Algorithm: Line Fitting (0) | 2008.06.29 |
| Gaussian Mixture Model (2) | 2008.06.07 |
| Rasterizing Voronoi Diagram (0) | 2008.05.26 |


