주어진 데이터를 받아서 극대점과 극소점을 찾는다. 극점은 이전 극점과 일정한 차이(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) 히스트그램:
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 |