[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