이미지의 히스토그램에서 피크를 찾는 작업을 하기 위해서 보통 히스토그램을 평균필터나 가우시안 필터로 컨볼류선을 한 후에 사용한다. 여기서는 히스토그램의 각각의 레벨에서의 값(=(레벨, 히스토그램값))을 베지어 컨트롤 포인트로 하여서 만든 베지어 커브로 히스토그램을 근사하려고 한다. 따라서 베지어곡선은 255 찻수의 곡선이 된다. 높은 차수의 베지어커브를 계산하기 위해서 Berstein 함수를 그대로 사용하는 경우에는 수치에러가 발생하여 값이 불안정해진다. 이런 경우에는 De Casteljau's algorithm을 이용하여서 반복적으로 계산을 하면 된다.
//
int SmoothenHistogram (int hist[], int numLevels/*=255*/) {
    // deCasteljau's algorithm
    std::vector<double> p(numLevels+1);
    std::vector<double> hist2(numLevels+1);
    // back-up;
    for(int k = 0; k <= numLevels; k++)
        hist2[k] = hist[k];
    for (int j = 0; j <= numLevels; j++) {
        double t = j*1.0/(numLevels+1);
        for(int i=0; i <= numLevels; i++) p[i] = hist2[i];
        // numLevels-order;
        for(int k = 1; k <= numLevels; k++) {
            for(int i = 0; i < (numLevels + 1 - k); i++)
                p[i] = (1 - t) * p[i] + t * p[i+1] ;
        }
        // final interploation --> p[0];
        hist[j] = (int) p[0];
    }
    return 1;
};

빨간색 프로파일이 원래 데이터이고, 파란색  경계가  Bezier smoothing 을 적용한 결과이다.

베지어곡선 위키피디아: http://en.wikipedia.org/wiki/B%C3%A9zier_curve

'Image Recognition > Fundamental' 카테고리의 다른 글

Object Orientation  (1) 2010.01.17
Bicubic Interpolation  (1) 2010.01.14
Histogram Smoothing via Bezier Curve  (1) 2010.01.10
Running Median Filter  (0) 2010.01.07
Fast Median Filter 3x3  (0) 2009.11.27
Fant's Resampling  (0) 2008.12.17
Posted by helloktk

댓글을 달아 주세요

  1. helloktk 2010.02.02 19:16 신고  댓글주소  수정/삭제  댓글쓰기

    관심을 가져주어서 감사합니다. p[0]는 결과값이 맞습니다(De Casteljau's algorithm을 그래로 적용한 것입니다). 그리고, 포스팅된 코드를 긁어서 다시 돌려보았는데, 정상적으로 작동합니다. 건비님의 코드에서 히스토그램을 만들 때 histogram배열을 초기를 하고 사용했는지 체크를 해보기바랍니다.