改善:
1、对原图像进行二次中位数滤波
2、对得到的关键点图像进行转折点滤波
#include "iostream"
#include "set"
#include "cmath"
#include "iterator"
#include "fstream"
#include "vector"
#include "cstring"
using namespace std;
double *x; //数据
double *m; //中位数
int n;
set<int> IE; //极值点初始集合,存储数据的下标
set<int> T; //转折点集合,存储数据的下标
set<int> E; //去除IE中噪音中极值点集合,存储数据下标
vector<int> K; //集合T、E的并集,存储数据下标
void mid() //中值滤波
{
int i;
m[1] = x[1];
double temp;
for(i=2; i<n; i++)
{
temp = (x[i-1] + x[i] + x[i+1]) / 3;
if(abs(temp - x[i]) > 3)
m[i] = temp;
else
m[i] = x[i];
}
m[n] = x[n];
}
void KPSegmentation(double error, double maxTime)
{
IE.insert(1); //第一个数据点放入极值点初始集合
int i;
for(i=2; i<n; i++)
{
if((x[i]>x[i-1] && x[i]>x[i+1]) || (x[i]<x[i-1] && x[i]<x[i+1]))
{
//cout << i << endl;
IE.insert(i); //将第i个数据点放入极值点初始集合
}
if(fabs( x[i] - ((x[i+1]+x[i-1])/2) ) > error)
{
//cout << i << endl;
T.insert(i);
}
}
E.insert(1); //第一个数据放入极值点集合
set<int>::iterator it1;
set<int>::iterator it2;
it1 = it2 = IE.begin();
it2++;
while(it2 != IE.end())
{
if((*it2 - *it1) > maxTime) //如果该极值点保持的时间段>maxTime,相当于两个数据下标的差值
{
//cout << *it2 << endl;
E.insert(*it2);
}
it1++;
it2++;
}
set<int>::iterator it;
it = T.begin();
while(it != T.end()) //合并集合E, T
{
E.insert(*it);
it++;
}
}
vector<int> key; //存储滤波后的关键点下标
int main()
{
ifstream fin("小区1.txt");
ofstream fout("关键点.txt"); //滤波后的存储关键点的下标和值
ofstream fout1("x.txt"); //滤波后的存储关键点下标
ofstream fout2("y.txt"); //滤波后的存储关键的值
ofstream fout3("m.txt"); //滤波后的中位数滤波后的值
int i;
double error = 4.5;
double maxTime = 3;
fin >> n;
x = new double[n+1];
m = new double[n+1];
for(i=1; i<=n; i++)
{
fin >> x[i];
}
mid();
memcpy(x, m, sizeof(double)*(n+1));
mid();
for(i=1; i<=n; i++)
{
fout3 << m[i] << endl;
x[i] = m[i];
}
KPSegmentation(error, maxTime);
double error1 = 7;
set<int>:: iterator it1, it2, it3;
it1 = it2 = it3 = E.begin();
it2++;
it3++; it3++;
key.push_back(*it1);
while(it3 != E.end()) //对关键点滤波
{
if(fabs(x[*it2] - ((x[*it1]+x[*it3])/2) ) > error1)
{
key.push_back(*it2);
}
it1++;
it2++;
it3++;
}
key.push_back(*it2);
for(i=0; i<key.size(); i++)
{
fout << key[i] << " " << x[key[i]] << "\n";
fout1 << key[i] << endl;
fout2 << x[key[i]] << endl;
}
return 0;
}