滑动均值Moving Average与中值滤波Moving Median

    xiaoxiao2025-06-15  15

    1. 滑动均值滤波(MovingAverage

    方法:

    把连续取N个采样值看成一个队列,队列的长度固定为N,每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)。把队列中的N个数据进行算术平均运算,就可获得新的滤波结果。

    #include "iostream" #include "list" using namespace std; int main() { int sum = 0; double real = 0; int Length = 4; // 四个一组 int i[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; size_t sz = sizeof(i)/sizeof(int); list<int> int_list(i, i + Length); cout << "list_size = "<<sz<<endl; list<int>::iterator i0; for( i0 = int_list.begin (); i0 != int_list.end (); i0++) { // cout << *i0 << endl; sum += *i0; } real = sum / (double)Length; cout << "1 averg = "<<real << endl; // sum = sum - *int_list.begin () ; //cout << "Remove begin "<<*int_list.begin ()<<" sum = "<<sum << endl; // int_list.pop_front (); // int_list.push_back (i[Length]); // 5 // sum = sum + int_list.back (); // real = sum / (double)Length; //cout << "Add last "<<int_list.back ()<< " sum = "<<sum << endl; //cout << "2 real = "<<real << endl; int total_loop = sz -Length +1; for (int var = Length; var < sz; ++var) // i[4] = 5 { sum = sum - *int_list.begin () ; cout << "Remove begin "<<*int_list.begin ()<<" sum = "<<sum << endl; int_list.pop_front (); int_list.push_back (i[var]); // 5 sum = sum + int_list.back () ; cout << "Add last "<<int_list.back ()<< " sum = "<<sum << endl; real = sum / (double)Length; cout << total_loop + var -sz +1<<" averg = "<<real << endl; } return 0; }

    ==============================2017.02====================================

    有源代码 MovingAverage

    http://blog.csdn.net/u014365862/article/details/54380313

    2. 加权滑动均值

    #include "iostream" #include "deque" #include <algorithm> using namespace std; //const int Length = 4; //int coe[Length] = {2, 4, 8, 6}; const int Length = 10; int coe[Length] = {1, 1, 2, 3, 3, 16, 17, 19 ,19, 19};// 100; 7.6 ~ 13.6 int sum_coe = 0; int main() { int sum = 0; double real = 0; for(int i =0; i < Length; ++i) { sum_coe += coe[i]; } cout<<"sum_coe = "<< sum_coe<<endl; // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 int i[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; // int i[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 9, 10, 11, 10}; size_t sz = sizeof(i)/sizeof(int); size_t n = sz / Length; deque<int> int_list(i, i + Length); for (int var = 0; var < Length; ++var) { sum += (int_list.at(var) )* coe[var]; } real = sum / (double)sum_coe; cout << "sum1 = "<<sum << endl; cout << "1 real = "<<real << endl; int total_loop = sz -Length +1; for (int var = Length; var < sz; ++var) // i[4] = 5 { sum = 0; cout << "Remove begin "<<*int_list.begin () << endl; int_list.pop_front (); int_list.push_back (i[var]); // 5 for (int i = 0; i < Length; ++i) { sum += (int_list.at(i) )* coe[i]; } real = sum / (double)sum_coe; cout << "Add last "<<int_list.back ()<< " sum = "<<sum << endl; cout << total_loop + var -sz +1<<" averg = "<<real << endl; } return 0; }

    3. 中值滤波(Moving Median)

    选一个数周围的奇数个临近值,作为一组,排序,用中值替代原来那个数。

    /************************** * * static number of array. * **************************/ #include "iostream" #include "deque" #include "list" #include <algorithm> using namespace std; const int Length = 7; const int halfSamplecount = Length /2 + 1; // 4 //void outputArray ( int *i) //void outputArray ( int i[]) void outputArray ( int (&i)[18]) // if use upper, the sz below compute strangely. //void outputArray ( int (&i)[13]) // if use upper, the sz below compute strangely. { size_t sz = sizeof(i)/sizeof(int); // cout << sizeof(i)<<" / "<<sizeof(int)<<endl; for (int var = 0; var < sz; ++var) { cout << i[var] <<" "; } cout<< endl; } void output_List( deque<int> & int_deque) { for(deque<int>::iterator i0 = int_deque.begin (); i0 != int_deque.end (); ++i0) { cout << *i0<<" " ; } cout<<endl; } int main() { // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 int i[] = {10, 12, 11, 25, 9, 10, 9, 45, 13, 12, 10, 11, 78, 12, 12, 13, 10, 9}; int j[] = {10, 12, 11, 25, 9, 10, 9, 45, 13, 12, 10, 11, 78, 12, 12, 13, 10, 9}; // int i[] = {10, 12, 11, 25, 9, 10, 9, 45, 13, 12, 10, 11, 78}; // int j[] = {10, 12, 11, 25, 9, 10, 9, 45, 13, 12, 10, 11, 78}; // int i[] = {-10, -12, -11, -25, -9, -10, -9, -45, -13, -12, -10, -11, -78}; // int j[] = {-10, -12, -11, -25, -9, -10, -9, -45, -13, -12, -10, -11, -78}; outputArray(i); int count = 0; size_t sz = sizeof(i)/sizeof(int); size_t n = sz / Length; deque<int> int_deque(i, i + halfSamplecount); // int_deque.push_front (sz - 1); // int_deque.push_front (sz - 2); // int_deque.push_front (sz - 3); for (int var = 1; var <= halfSamplecount - 1; ++var) { int_deque.push_front (i[sz - var]); } //output_List (int_deque); deque<int> temp_deque(int_deque); output_List (temp_deque); sort(temp_deque.begin (), temp_deque.end ()); cout<<"after sort ";output_List (temp_deque); cout<<"mid = "<<temp_deque.at (halfSamplecount -1)<<endl; // 9 10 10 11 12 13 25 i[0] = temp_deque.at (halfSamplecount - 1); outputArray(i); ++count; cout<<"----------- 1-----------"<<endl; int total_loop = sz -halfSamplecount; // 18 - 4 int var = 0; for ( var = halfSamplecount; var < sz ; ++var) // i[4] = 9 { cout << "Remove begin "<<*int_deque.begin ()<<endl; int_deque.pop_front (); output_List (int_deque); int_deque.push_back (i[var]);//9 halfSamplecount cout << "Add last "<<int_deque.back ()<<endl; output_List (int_deque); temp_deque = int_deque; sort(temp_deque.begin (), temp_deque.end ()); cout<<"after sort ";output_List (temp_deque); i[total_loop + var -sz +1] = temp_deque.at (halfSamplecount - 1); // cout<<"after replace ";outputArray(i); cout<<"-- "<<total_loop + var -sz +2<<"--"<<endl; } if (var == sz ) { var = 0; for ( var; var < halfSamplecount -1; ++var) // [0 ~ 3) { cout << "Remove begin "<<*int_deque.begin ()<<endl; int_deque.pop_front (); output_List (int_deque); int_deque.push_back (j[var]);// 10 cout << "Add last "<<int_deque.back ()<<endl; output_List (int_deque); temp_deque = int_deque; sort(temp_deque.begin (), temp_deque.end ()); cout<<"after sort ";output_List (temp_deque); i[ sz - halfSamplecount + var + 1] = temp_deque.at (halfSamplecount - 1); // cout<<"after replace ";outputArray(i); cout<<"-- "<<total_loop + var +2<<"--"<<endl; } outputArray(j); } return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-1299964.html
    最新回复(0)