Peak Finder

Image Recognition 2012. 2. 2. 21:41

주어진 데이터를 받아서 극대점과 극소점을 찾는다. 극점은 이전 극점과 일정한 차이(delta)가 날 때만 취한다. 맨 처음과 나중에 들어오는 데이터가 극점일 때, 별도의 처리가 필요하다.

BOOL peakFinder(std::vector<double>& data, double delta, /*IN*/
                std::vector<int>& maxPosition, /*OUT*/ 
                std::vector<int>& minPosition) /*OUT*/ {
    int maxPos = -1, minPos = -1;
    bool lookForMax = true;
    double maxVal = -FLT_MAX, minVal = FLT_MAX ;
    for (int i = 0; i < data.size(); i++) {
        double currVal = data[i] ;
        if (currVal > maxVal) {
            maxVal = currVal ;
            maxPos = i;
        } else if (currVal < minVal) {
            minVal = currVal ;
            minPos = i;
        }
        if (lookForMax) {
            // 극대값을 찾는 상태이고, 현재값이 maxVal보다 충분이 아래면,
            // 이 maxVal이 극대값임 & 현재위치가 극소값의 후보가 됨;
            if (currVal < (maxVal - delta)) {
                maxPosition.push_back(maxPos);
                minVal = currVal ;
                minPos = i;
                lookForMax = false; //다음번에는 최소값을 찾는다;
            }
        } else {
            // 극소값을 찾는 상태이고, 현재값이 minVal보다 충분히 위면,
            // 이 minVal이 극소점임 & 현재위치가 극대값 후보가 됨;
            if (currVal > (minVal + delta)) {
                minPosition.push_back(minPos);
                maxVal = currVal;
                maxPos = i;
                lookForMax = true; //다음번에는 최대값을 찾는다;
            }
        }
    }
    return TRUE;
};

데이터 구간이 (0,255) 히스트그램:

delta=5
delta=10
delta=15

 

 
728x90

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

Perspective Transformation  (2) 2012.02.14
Integral Image을 이용한 Adaptive Threshold  (0) 2012.02.04
QR-code: decoder  (0) 2012.01.26
QR-code: detector  (0) 2012.01.12
Adaboost  (0) 2010.12.28
Posted by helloktk
,