[pktools] 325/375: working on filter in spectral domain

Bas Couwenberg sebastic at xs4all.nl
Wed Dec 3 21:54:26 UTC 2014


This is an automated email from the git hooks/post-receive script.

sebastic-guest pushed a commit to branch upstream-master
in repository pktools.

commit 90bff0e3382611a5cf183b91edc1b626643edd7a
Author: Pieter Kempeneers <kempenep at gmail.com>
Date:   Sun Sep 21 14:11:40 2014 -0700

    working on filter in spectral domain
---
 src/algorithms/Filter.cc |  7 ++---
 src/algorithms/Filter.h  | 82 +++++++++++++++++-------------------------------
 src/apps/pkfilter.cc     |  6 ++--
 3 files changed, 35 insertions(+), 60 deletions(-)

diff --git a/src/algorithms/Filter.cc b/src/algorithms/Filter.cc
index ee48822..fd4124a 100644
--- a/src/algorithms/Filter.cc
+++ b/src/algorithms/Filter.cc
@@ -386,10 +386,10 @@ void filter::Filter::stat(const ImgReaderGdal& input, ImgWriterGdal& output, con
   }
 }
 
-void filter::Filter::filter(const ImgReaderGdal& input, ImgWriterGdal& output, const std::string& method, int dim, short down, int offset)
+void filter::Filter::filter(const ImgReaderGdal& input, ImgWriterGdal& output, const std::string& method, int dim)
 {
   Vector2d<double> lineInput(input.nrOfBand(),input.nrOfCol());
-  Vector2d<double> lineOutput;
+  Vector2d<double> lineOutput(input.nrOfBand(),input.nrOfCol());;
   const char* pszMessage;
   void* pProgressArg=NULL;
   GDALProgressFunc pfnProgress=GDALTermProgress;
@@ -402,8 +402,7 @@ void filter::Filter::filter(const ImgReaderGdal& input, ImgWriterGdal& output, c
     vector<double> pixelOutput;
     for(int x=0;x<input.nrOfCol();++x){
       pixelInput=lineInput.selectCol(x);
-      filter(pixelInput,pixelOutput,method,dim,down,offset);
-      lineOutput.resize(pixelOutput.size(),input.nrOfCol());
+      filter(pixelInput,pixelOutput,method,dim);
       for(int iband=0;iband<pixelOutput.size();++iband)
         lineOutput[iband][x]=pixelOutput[iband];
     }
diff --git a/src/algorithms/Filter.h b/src/algorithms/Filter.h
index b8172e8..53be2b7 100644
--- a/src/algorithms/Filter.h
+++ b/src/algorithms/Filter.h
@@ -58,7 +58,7 @@ public:
   void pushClass(short theClass=1){m_class.push_back(theClass);};
   void pushMask(short theMask=0){m_mask.push_back(theMask);};
   template<class T> void filter(const std::vector<T>& input, std::vector<T>& output, int down=1, int offset=0);
-  template<class T> void filter(const std::vector<T>& input, std::vector<T>& output, const std::string& method, int dim, int down=1, int offset=0);
+  template<class T> void filter(const std::vector<T>& input, std::vector<T>& output, const std::string& method, int dim);
   template<class T> void smooth(const std::vector<T>& input, std::vector<T>& output, short dim, int down=1, int offset=0);
   template<class T> void filter(T* input, int inputSize, std::vector<T>& output, int down=1, int offset=0);
   template<class T> void smooth(T* input, int inputSize, std::vector<T>& output, short dim, int down=1, int offset=0);
@@ -66,7 +66,7 @@ public:
   void morphology(const ImgReaderGdal& input, ImgWriterGdal& output, const std::string& method, int dim, short down=1, int offset=0, short verbose=0);
   void filter(const ImgReaderGdal& input, ImgWriterGdal& output, short down=1, int offset=0);
   void stat(const ImgReaderGdal& input, ImgWriterGdal& output, const std::string& method, short down=1, int offset=0);
-  void filter(const ImgReaderGdal& input, ImgWriterGdal& output, const std::string& method, int dim, short down=1, int offset=0);
+  void filter(const ImgReaderGdal& input, ImgWriterGdal& output, const std::string& method, int dim);
   void smooth(const ImgReaderGdal& input, ImgWriterGdal& output, short dim, short down=1, int offset=0);
   double getCentreWavelength(const std::vector<double> &wavelengthIn, const Vector2d<double>& srf, const std::string& interpolationType, double delta=1.0, bool verbose=false);
   template<class T> double applySrf(const std::vector<double> &wavelengthIn, const std::vector<T>& input, const Vector2d<double>& srf, const std::string& interpolationType, T& output, double delta=1.0, bool normalize=false, bool verbose=false);
@@ -450,17 +450,17 @@ template<class T> void Filter::filter(const std::vector<T>& input, std::vector<T
   }
 }
 
- template<class T> void Filter::filter(const std::vector<T>& input, std::vector<T>& output, const std::string& method, int dim, int down, int offset)
+ template<class T> void Filter::filter(const std::vector<T>& input, std::vector<T>& output, const std::string& method, int dim)
 {
   bool verbose=false;
   assert(dim);
-  output.resize((input.size()-offset+down-1)/down);
+  output.resize(input.size());
   int i=0;
   statfactory::StatFactory stat;
   std::vector<T> statBuffer;
   short binValue=0;
   //start: extend input with mirrored version of itself
-  for(i=offset;i<dim/2;++i){
+  for(i=0;i<dim/2;++i){
     binValue=0;
     for(int iclass=0;iclass<m_class.size();++iclass){
       if(input[i]==m_class[iclass]){
@@ -490,44 +490,38 @@ template<class T> void Filter::filter(const std::vector<T>& input, std::vector<T
       }
     }
     assert(statBuffer.size()==dim);
-    if((i-offset)%down){
-      statBuffer.clear();
-      continue;
-    }
+    /* if((i-offset)%down){ */
+    /*   statBuffer.clear(); */
+    /*   continue; */
+    /* } */
     switch(getFilterType(method)){
     case(filter::median):
-      output[(i-offset+down-1)/down]=stat.median(statBuffer);
+      output[i]=stat.median(statBuffer);
       break;
     case(filter::min):
-      output[(i-offset+down-1)/down]=stat.mymin(statBuffer);
+      output[i]=stat.mymin(statBuffer);
       break;
     case(filter::max):
-      output[(i-offset+down-1)/down]=stat.mymax(statBuffer);
+      output[i]=stat.mymax(statBuffer);
       break;
     case(filter::sum):
-      output[(i-offset+down-1)/down]=sqrt(stat.sum(statBuffer));
+      output[i]=sqrt(stat.sum(statBuffer));
       break;
     case(filter::var):
-      output[(i-offset+down-1)/down]=stat.var(statBuffer);
+      output[i]=stat.var(statBuffer);
       break;
     case(filter::mean):
-      output[(i-offset+down-1)/down]=stat.mean(statBuffer);
+      output[i]=stat.mean(statBuffer);
       break;
     default:
       std::string errorString="method not supported";
       throw(errorString);
       break;
     }
-    if(verbose){
-      std::cout << "buffer: ";
-      for(int ibuf=0;ibuf<statBuffer.size();++ibuf)
-        std::cout << statBuffer[ibuf] << " ";
-      std::cout << "->" << output[(i-offset+down-1)/down] << std::endl;
-    }
   }
   //main
   statBuffer.clear();
-  for(i=offset+dim/2;i<input.size()-dim/2;++i){
+  for(i=dim/2;i<input.size()-dim/2;++i){
     binValue=0;
     for(int t=0;t<dim;++t){
       for(int iclass=0;iclass<m_class.size();++iclass){
@@ -542,40 +536,30 @@ template<class T> void Filter::filter(const std::vector<T>& input, std::vector<T
         statBuffer.push_back(input[i-dim/2+t]);
     }
     assert(statBuffer.size()==dim);
-    if((i-offset)%down){
-      statBuffer.clear();
-      continue;
-    }
     switch(getFilterType(method)){
     case(filter::median):
-      output[(i-offset+down-1)/down]=stat.median(statBuffer);
+      output[i]=stat.median(statBuffer);
       break;
     case(filter::min):
-      output[(i-offset+down-1)/down]=stat.mymin(statBuffer);
+      output[i]=stat.mymin(statBuffer);
       break;
     case(filter::max):
-      output[(i-offset+down-1)/down]=stat.mymax(statBuffer);
+      output[i]=stat.mymax(statBuffer);
       break;
     case(filter::sum):
-      output[(i-offset+down-1)/down]=sqrt(stat.sum(statBuffer));
+      output[i]=sqrt(stat.sum(statBuffer));
       break;
     case(filter::var):
-      output[(i-offset+down-1)/down]=stat.var(statBuffer);
+      output[i]=stat.var(statBuffer);
       break;
     case(filter::mean):
-      output[(i-offset+down-1)/down]=stat.mean(statBuffer);
+      output[i]=stat.mean(statBuffer);
       break;
     default:
       std::string errorString="method not supported";
       throw(errorString);
       break;
     }
-    if(verbose){
-      std::cout << "buffer: ";
-      for(int ibuf=0;ibuf<statBuffer.size();++ibuf)
-        std::cout << statBuffer[ibuf] << " ";
-      std::cout << "->" << output[(i-offset+down-1)/down] << std::endl;
-    }
     statBuffer.clear();
   }
   //end: extend input with mirrored version of itself
@@ -608,40 +592,30 @@ template<class T> void Filter::filter(const std::vector<T>& input, std::vector<T
           statBuffer.push_back(input[i-t]);
         }
       }
-    if((i-offset)%down){
-      statBuffer.clear();
-      continue;
-    }
     switch(getFilterType(method)){
     case(filter::median):
-      output[(i-offset+down-1)/down]=stat.median(statBuffer);
+      output[i]=stat.median(statBuffer);
       break;
     case(filter::min):
-      output[(i-offset+down-1)/down]=stat.mymin(statBuffer);
+      output[i]=stat.mymin(statBuffer);
       break;
     case(filter::max):
-      output[(i-offset+down-1)/down]=stat.mymax(statBuffer);
+      output[i]=stat.mymax(statBuffer);
       break;
     case(filter::sum):
-      output[(i-offset+down-1)/down]=sqrt(stat.sum(statBuffer));
+      output[i]=sqrt(stat.sum(statBuffer));
       break;
     case(filter::var):
-      output[(i-offset+down-1)/down]=stat.var(statBuffer);
+      output[i]=stat.var(statBuffer);
       break;
     case(filter::mean):
-      output[(i-offset+down-1)/down]=stat.mean(statBuffer);
+      output[i]=stat.mean(statBuffer);
       break;
     default:
       std::string errorString="method not supported";
       throw(errorString);
       break;
     }
-    if(verbose){
-      std::cout << "buffer: ";
-      for(int ibuf=0;ibuf<statBuffer.size();++ibuf)
-        std::cout << statBuffer[ibuf] << " ";
-      std::cout << "->" << output[(i-offset+down-1)/down] << std::endl;
-    }
   }
 }
 
diff --git a/src/apps/pkfilter.cc b/src/apps/pkfilter.cc
index d8f04cd..2d704e1 100644
--- a/src/apps/pkfilter.cc
+++ b/src/apps/pkfilter.cc
@@ -711,8 +711,10 @@ int main(int argc,char **argv) {
       if(dimZ_opt.size()){
 	if(dimZ_opt.size()==1)
 	  filter1d.stat(input,output,method_opt[0],down_opt[0]);
-	else
-	  filter1d.filter(input,output,method_opt[0],dimZ_opt[0],down_opt[0]);
+	else{
+	  assert(down_opt[0]==1);//not implemented yet...
+	  filter1d.filter(input,output,method_opt[0],dimZ_opt[0]);
+	}
       }
       else
 	filter2d.doit(input,output,method_opt[0],dimX_opt[0],dimY_opt[0],down_opt[0],disc_opt[0]);

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/pktools.git



More information about the Pkg-grass-devel mailing list