//src: 输入数据

//minPeakDistance: 相邻两个局部极大值的最小间距。

//minHeightDiff: kernelSize范围内极大值与极小值的最小差值。与matlab的threshold目的一样,用来剔除flat peaks。

//minPeakHeight:Peak的值低于minPeakHeight会被排除。

void localMaxima(vector src,const int minPeakDistance,const double minHeightDiff,const double minPeakHeight,int* maxLoc)

{

int kernelSize = minPeakDistance;//kernelSize指局部区域半径

int minLoc=0;

double minVal=0,maxVal=0,diff=0;

Point minLocPt,maxLocPt;

Mat m(src);

*maxLoc = -1;//means not find localMaxima

for (size_t Loc = kernelSize; Loc < src.size()-kernelSize; Loc++)

{

Mat m_part = m.rowRange(Loc-kernelSize,Loc+kernelSize);//获取[Loc-kernelSize,Loc+kernelSize]范围内数据

minMaxLoc(m_part,&minVal,&maxVal,&minLocPt,&maxLocPt);//计算极大值位置

//maxLocPt.y == kernelSize,极大值应该在kernel区域中心

//使用minHeightDiff来剔除flat peaks

if(maxLocPt.y == kernelSize && maxVal > minPeakHeight &&

maxVal - minVal > minHeightDiff && maxVal - minVal > diff)

{

*maxLoc = Loc -kernelSize + maxLocPt.y;

diff = maxVal - minVal;

}

}

}

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐