520{
521 bool verbose=false;
522 assert(dim);
523 output.resize(input.size());
524 int i=0;
526 stat.setNoDataValues(m_noDataValues);
527 std::vector<T> statBuffer;
528 short binValue=0;
529
530 for(i=0;i<dim/2;++i){
531 binValue=0;
532 for(int iclass=0;iclass<m_class.size();++iclass){
533 if(input[i]==m_class[iclass]){
534 binValue=m_class[0];
535 break;
536 }
537 }
538 if(m_class.size())
539 statBuffer.push_back(binValue);
540 else
541 statBuffer.push_back(input[i]);
542
543 for(int t=1;t<=dim/2;++t){
544 T theValue=input[i+t];
545 for(int iclass=0;iclass<m_class.size();++iclass){
546 if(theValue==m_class[iclass]){
547 binValue=m_class[0];
548 break;
549 }
550 }
551 if(m_class.size())
552 statBuffer.push_back(binValue);
553 else
554 statBuffer.push_back(theValue);
555
556 if(i>=t){
557 theValue=input[i-t];
558 }
559 else{
560 switch(getPadding(m_padding)){
561 case(replicate):
562 theValue=input[0];
563 break;
564 case(circular):
565 theValue=input[input.size()+i-t];
566 break;
567 case(zero):
568 theValue=0;
569 break;
570 case(symmetric):
571 default:
572 theValue=input[t-i];
573 break;
574 }
575 }
576 for(int iclass=0;iclass<m_class.size();++iclass){
577 if(theValue==m_class[iclass]){
578 binValue=m_class[0];
579 break;
580 }
581 }
582 if(m_class.size())
583 statBuffer.push_back(binValue);
584 else
585 statBuffer.push_back(theValue);
586 }
587
588 switch(getFilterType(method)){
589 case(filter::nvalid):
590 output[i]=stat.nvalid(statBuffer);
591 break;
592 case(filter::median):
593 output[i]=stat.median(statBuffer);
594 break;
595 case(filter::min):
596 case(filter::erode):
597 output[i]=stat.mymin(statBuffer);
598 break;
599 case(filter::max):
600 case(filter::dilate):
601 output[i]=stat.mymax(statBuffer);
602 break;
603 case(filter::sum):
604 output[i]=sqrt(stat.sum(statBuffer));
605 break;
606 case(filter::var):
607 output[i]=stat.var(statBuffer);
608 break;
609 case(filter::stdev):
610 output[i]=sqrt(stat.var(statBuffer));
611 break;
612 case(filter::mean):
613 output[i]=stat.mean(statBuffer);
614 break;
615 case(filter::percentile):
616 assert(m_threshold.size());
617 output[i]=stat.percentile(statBuffer,statBuffer.begin(),statBuffer.end(),m_threshold[0]);
618 break;
619 default:{
620 std::ostringstream ess;
621 ess << "method " << method << " (" << getFilterType(method) << ") not supported";
622 throw(ess.str());
623 break;
624 }
625 }
626 }
627
628 statBuffer.clear();
629 for(i=dim/2;i<input.size()-dim/2;++i){
630 binValue=0;
631 for(int t=0;t<dim;++t){
632 for(int iclass=0;iclass<m_class.size();++iclass){
633 if(input[i-dim/2+t]==m_class[iclass]){
634 binValue=m_class[0];
635 break;
636 }
637 }
638 if(m_class.size())
639 statBuffer.push_back(binValue);
640 else
641 statBuffer.push_back(input[i-dim/2+t]);
642 }
643 switch(getFilterType(method)){
644 case(filter::nvalid):
645 output[i]=stat.nvalid(statBuffer);
646 break;
647 case(filter::median):
648 output[i]=stat.median(statBuffer);
649 break;
650 case(filter::min):
651 case(filter::erode):
652 output[i]=stat.mymin(statBuffer);
653 break;
654 case(filter::max):
655 case(filter::dilate):
656 output[i]=stat.mymax(statBuffer);
657 break;
658 case(filter::sum):
659 output[i]=sqrt(stat.sum(statBuffer));
660 break;
661 case(filter::var):
662 output[i]=stat.var(statBuffer);
663 break;
664 case(filter::mean):
665 output[i]=stat.mean(statBuffer);
666 break;
667 case(filter::percentile):
668 assert(m_threshold.size());
669 output[i]=stat.percentile(statBuffer,statBuffer.begin(),statBuffer.end(),m_threshold[0]);
670 break;
671 default:
672 std::string errorString="method not supported";
673 throw(errorString);
674 break;
675 }
676 statBuffer.clear();
677 }
678
679 for(i=input.size()-dim/2;i<input.size();++i){
680 binValue=0;
681 for(int iclass=0;iclass<m_class.size();++iclass){
682 if(input[i]==m_class[iclass]){
683 binValue=m_class[0];
684 break;
685 }
686 }
687 if(m_class.size())
688 statBuffer.push_back(binValue);
689 else
690 statBuffer.push_back(input[i]);
691
692 for(int t=1;t<=dim/2;++t){
693 T theValue=input[i-t];
694 for(int iclass=0;iclass<m_class.size();++iclass){
695 if(theValue==m_class[iclass]){
696 binValue=m_class[0];
697 break;
698 }
699 }
700 if(m_class.size())
701 statBuffer.push_back(binValue);
702 else
703 statBuffer.push_back(theValue);
704 if(i+t<input.size())
705 theValue=input[i+t];
706 else{
707 switch(getPadding(m_padding)){
708 case(replicate):
709 theValue=input.back();
710 break;
711 case(circular):
712 theValue=input[t-1];
713 break;
714 case(zero):
715 theValue=0;
716 break;
717 case(symmetric):
718 default:
719 theValue=input[i-t];
720 break;
721 }
722 }
723 for(int iclass=0;iclass<m_class.size();++iclass){
724 if(theValue==m_class[iclass]){
725 binValue=m_class[0];
726 break;
727 }
728 }
729 if(m_class.size())
730 statBuffer.push_back(binValue);
731 else
732 statBuffer.push_back(theValue);
733 }
734 switch(getFilterType(method)){
735 case(filter::nvalid):
736 output[i]=stat.nvalid(statBuffer);
737 break;
738 case(filter::median):
739 output[i]=stat.median(statBuffer);
740 break;
741 case(filter::min):
742 case(filter::erode):
743 output[i]=stat.mymin(statBuffer);
744 break;
745 case(filter::max):
746 case(filter::dilate):
747 output[i]=stat.mymax(statBuffer);
748 break;
749 case(filter::sum):
750 output[i]=sqrt(stat.sum(statBuffer));
751 break;
752 case(filter::var):
753 output[i]=stat.var(statBuffer);
754 break;
755 case(filter::mean):
756 output[i]=stat.mean(statBuffer);
757 break;
758 case(filter::percentile):
759 assert(m_threshold.size());
760 output[i]=stat.percentile(statBuffer,statBuffer.begin(),statBuffer.end(),m_threshold[0]);
761 break;
762 default:
763 std::string errorString="method not supported";
764 throw(errorString);
765 break;
766 }
767 }
768 }