类似统计数据为0,1,1,2,3,2,1,1,0,0,2,3,3,5,3,5,3,0…等这样具有明显波峰的极值筛选。
//定义大小为Image.cols(主要避免越界,可随意定义)
std::vector<int> countPixel(Image.cols,0);
//由于可能存在相同的极值,所以对直方图数据进行平滑,权重和为1
const double filter[7] = {0.0536,0.1232,0.2032,0.2400,0.2032,0.1232,0.0536};
std::vector<double> countPixSmooth(countPiexl.size(),0);
for(int n = 3; n < countPiexl.size() - 3; ++i){
countPixSmooth[n] = countPixel[n-3] * filter[0]
+ countPixel[n-2] * filter[1]
+ countPixel[n-1] * filter[2]
+ countPixel[n-0] * filter[3]
+ countPixel[n + 3] * filter[4]
+ countPixel[n + 3] * filter[5]
+ countPixel[n + 3] * filter[6];
}
//maxPiexl存放极大值
std::vector<int> maxPiexl;
for(int n = 3; n < countPixSmooth.size() - 3; ++n){
if(countPixSmooth[n] >= countPixSmooth[n-1]
&& countPixSmooth[n] >= countPixSmooth[n+1]
&& countPixSmooth[n] > countPixSmooth[n-2]
&& countPixSmooth[n] > countPixSmooth[n+2]
&& countPixSmooth[n] > 5){
maxPiexl.push_back(n);
}
}