[pktools] 178/375: Filter2d.h: bug in m_nodata and pklas2img: did not take into account hthreshold in iteration

Bas Couwenberg sebastic at xs4all.nl
Wed Dec 3 21:54:11 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 f28a04b91291ab75c4d1a9ce9ea79f04f3509105
Author: Pieter Kempeneers <kempenep at kempenep-OptiPlex-9020.(none)>
Date:   Thu Jan 9 18:59:11 2014 +0100

    Filter2d.h: bug in m_nodata and pklas2img: did not take into account hthreshold in iteration
---
 src/algorithms/Filter2d.h | 42 +++++++++++++++++++++++++-----------------
 src/apps/pklas2img.cc     |  6 +++---
 2 files changed, 28 insertions(+), 20 deletions(-)

diff --git a/src/algorithms/Filter2d.h b/src/algorithms/Filter2d.h
index 6024ef5..272cb49 100644
--- a/src/algorithms/Filter2d.h
+++ b/src/algorithms/Filter2d.h
@@ -248,6 +248,10 @@ template<class T1, class T2> void Filter2d::doit(const Vector2d<T1>& inputVector
   double progress=0;
   pfnProgress(progress,pszMessage,pProgressArg);
 
+  double noDataValue=0;
+  if(m_noDataValues.size())
+    noDataValue=m_noDataValues[0];
+
   assert(dimX);
   assert(dimY);
 
@@ -325,41 +329,41 @@ template<class T1, class T2> void Filter2d::doit(const Vector2d<T1>& inputVector
       switch(getFilterType(method)){
       case(filter2d::median):
         if(windowBuffer.empty())
-          outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;
+          outBuffer[x/down]=noDataValue;
         else
           outBuffer[x/down]=stat.median(windowBuffer);
         break;
       case(filter2d::var):{
         if(windowBuffer.empty())
-          outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;
+          outBuffer[x/down]=noDataValue;
         else
           outBuffer[x/down]=stat.var(windowBuffer);
         break;
       }
       case(filter2d::stdev):{
         if(windowBuffer.empty())
-          outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;
+          outBuffer[x/down]=noDataValue;
         else
           outBuffer[x/down]=sqrt(stat.var(windowBuffer));
         break;
       }
       case(filter2d::mean):{
         if(windowBuffer.empty())
-          outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;
+          outBuffer[x/down]=noDataValue;
         else
           outBuffer[x/down]=stat.mean(windowBuffer);
         break;
       }
       case(filter2d::min):{
         if(windowBuffer.empty())
-          outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;
+          outBuffer[x/down]=noDataValue;
         else
           outBuffer[x/down]=stat.min(windowBuffer);
         break;
       }
       case(filter2d::ismin):{
         if(windowBuffer.empty())
-          outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;
+          outBuffer[x/down]=noDataValue;
         else
           outBuffer[x/down]=(stat.min(windowBuffer)==windowBuffer[centre])? 1:0;
         break;
@@ -368,7 +372,7 @@ template<class T1, class T2> void Filter2d::doit(const Vector2d<T1>& inputVector
         double min=0;
         double max=0;
         if(windowBuffer.empty())
-          outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;
+          outBuffer[x/down]=noDataValue;
         else{
           stat.minmax(windowBuffer,windowBuffer.begin(),windowBuffer.end(),min,max);
           if(min!=max)
@@ -380,21 +384,21 @@ template<class T1, class T2> void Filter2d::doit(const Vector2d<T1>& inputVector
       }
       case(filter2d::max):{
         if(windowBuffer.empty())
-          outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;
+          outBuffer[x/down]=noDataValue;
         else
           outBuffer[x/down]=stat.max(windowBuffer);
         break;
       }
       case(filter2d::ismax):{
         if(windowBuffer.empty())
-          outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;
+          outBuffer[x/down]=noDataValue;
         else
           outBuffer[x/down]=(stat.max(windowBuffer)==windowBuffer[centre])? 1:0;
         break;
       }
       case(filter2d::order):{
         if(windowBuffer.empty())
-          outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;
+          outBuffer[x/down]=noDataValue;
         else{
           double lbound=0;
           double ubound=dimX*dimY;
@@ -413,7 +417,7 @@ template<class T1, class T2> void Filter2d::doit(const Vector2d<T1>& inputVector
         if(occurrence.size()==1)//all values in window must be the same
           outBuffer[x/down]=inBuffer[(dimY-1)/2][x];
         else//favorize original value in case of ties
-          outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;
+          outBuffer[x/down]=noDataValue;
         break;
       case(filter2d::heterog):{
         for(std::vector<double>::const_iterator wit=windowBuffer.begin();wit!=windowBuffer.end();++wit){
@@ -422,7 +426,7 @@ template<class T1, class T2> void Filter2d::doit(const Vector2d<T1>& inputVector
           else if(*wit!=inBuffer[(dimY-1)/2][x])
             outBuffer[x/down]=1;
           else if(*wit==inBuffer[(dimY-1)/2][x]){//todo:wit mag niet central pixel zijn
-            outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;
+            outBuffer[x/down]=noDataValue;
             break;
           }
         }
@@ -435,7 +439,7 @@ template<class T1, class T2> void Filter2d::doit(const Vector2d<T1>& inputVector
             outBuffer[x/down]+=100.0*occurrence[*(vit++)]/windowBuffer.size();
         }
         else
-          outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;
+          outBuffer[x/down]=noDataValue;
         break;
       }
       case(filter2d::majority):{
@@ -451,7 +455,7 @@ template<class T1, class T2> void Filter2d::doit(const Vector2d<T1>& inputVector
             outBuffer[x/down]=inBuffer[(dimY-1)/2][x];
         }
         else
-          outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;
+          outBuffer[x/down]=noDataValue;
         break;
       }
       case(filter2d::threshold):{
@@ -464,7 +468,7 @@ template<class T1, class T2> void Filter2d::doit(const Vector2d<T1>& inputVector
           }
         }
         else
-          outBuffer[x/down]=(m_noDataValues.size())? m_noDataValues[0] : 0;
+          outBuffer[x/down]=noDataValue;
         break;
       }
       case(filter2d::mixed):{
@@ -605,6 +609,10 @@ template<class T> unsigned long int Filter2d::morphology(const Vector2d<T>& inpu
   double progress=0;
   pfnProgress(progress,pszMessage,pProgressArg);
 
+  double noDataValue=0;
+  if(m_noDataValues.size())
+    noDataValue=m_noDataValues[0];
+
   unsigned long int nchange=0;
   assert(dimX);
   assert(dimY);
@@ -672,7 +680,7 @@ template<class T> unsigned long int Filter2d::morphology(const Vector2d<T>& inpu
                 indexJ=(dimY>2) ? (dimY-1)/2-j : 0;
               else
                 indexJ=(dimY-1)/2+j;
-            if(inBuffer[indexJ][indexI]==(m_noDataValues.size())? m_noDataValues[0] : 0)
+            if(inBuffer[indexJ][indexI]==noDataValue)
               continue;
             bool masked=false;
             for(int imask=0;imask<m_noDataValues.size();++imask){
@@ -724,7 +732,7 @@ template<class T> unsigned long int Filter2d::morphology(const Vector2d<T>& inpu
           // }
         }
         else
-          output[y][x]=(m_noDataValues.size())? m_noDataValues[0] : 0;
+          output[y][x]=noDataValue;
       }
     }
     progress=(1.0+y);
diff --git a/src/apps/pklas2img.cc b/src/apps/pklas2img.cc
index 4591572..22b6d8e 100644
--- a/src/apps/pklas2img.cc
+++ b/src/apps/pklas2img.cc
@@ -459,9 +459,9 @@ int main(int argc,char **argv) {
       std::cout << "iteration " << iteration << " with window size " << dimx << " and dh_max: " << hThreshold << std::endl;
       Vector2d<float> newOutput;
       try{
-        theFilter.morphology(outputData,currentOutput,"erode",dimx,dimy,disc_opt[0],maxSlope_opt[0]);
-        theFilter.morphology(currentOutput,outputData,"dilate",dimx,dimy,disc_opt[0],maxSlope_opt[0]);
-        if(postFilter_opt[0]=="bunting"){//todo: implement doit in Filter2d on Vector2d
+        theFilter.morphology(outputData,currentOutput,"erode",dimx,dimy,disc_opt[0],hThreshold);
+        theFilter.morphology(currentOutput,outputData,"dilate",dimx,dimy,disc_opt[0],hThreshold);
+        if(postFilter_opt[0]=="bunting"){
           theFilter.doit(outputData,currentOutput,"median",dimx,dimy,1,disc_opt[0]);
           outputData=currentOutput;
         }

-- 
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