median_filter.c 1.7 KB

123456789101112131415161718192021222324252627
  1. /*
  2. http://electronix.ru/forum/index.php?showtopic=114436&view=findpost&p=1180944
  3. Алгоритм основан на последовательной проверке точек массива на их "медианность".
  4. Проверка состоит в сравнении точки со всеми остальными - подсчетом двух сумм (s1 и s2) - количества точек, которые оказались больше данной, и количества тех, которые оказались меньше нее.
  5. Превышение показания хотя бы одного из счетчиков свыше половины длины массива (slit) бракует данную точку ДОСРОЧНО и переходит к проверке следующей (переход на nexti).
  6. До полного перебора всех точек обычно не доходит, т.к. подходящая точка находится раньше (где-то в середине массива), т.е. тоже ДОСРОЧНО.
  7. */
  8. datatype median( datatype array, int length) // массив и его длина
  9. {
  10. int slit = length/2;
  11. for( int i=0; i < length; i++) {
  12. int s1=0, s2=0;
  13. datatype val = array[i];
  14. for( int j=0; j < length; j++) {
  15. if( array[j] < val) {
  16. if( ++s1 > slit) break;
  17. } else if( array[j] > val) {
  18. if( ++s2 > slit) break;
  19. }
  20. }
  21. return val;
  22. }
  23. return 0; // чистая формальность, досюда исполнение никогда не доходит
  24. }