이미지의 히스토그램에서 피크를 찾는 작업을 하기 위해서 보통 히스토그램을 평균필터나 가우시안 필터로 컨볼류선을 한 후에 사용한다. 여기서는 히스토그램의 각각의 레벨에서의 값(=(레벨, 히스토그램값))을 베지어 컨트롤 포인트로 하여서 만든 베지어 커브로 히스토그램을 근사하려고 한다. 따라서 베지어곡선은 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