[pktools] 371/375: working on geo mask in pksvm

Bas Couwenberg sebastic at xs4all.nl
Wed Dec 3 21:54:31 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 424a7b6ca990bfc21578b1a6e7b422ae49357ed5
Author: Pieter Kempeneers <kempenep at gmail.com>
Date:   Mon Dec 1 10:27:16 2014 +0100

    working on geo mask in pksvm
---
 ChangeLog             |   3 +-
 src/apps/pkextract.cc |   6 +--
 src/apps/pksvm.cc     | 109 ++++++++++++++++++++++++++++----------------------
 3 files changed, 67 insertions(+), 51 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index d73fa64..c525c0f 100755
--- a/ChangeLog
+++ b/ChangeLog
@@ -328,7 +328,8 @@ version 2.6.1
  - pkfilter
 	Declare nodata option as double (see ticket #43500)
 	Support nodata values for filtering in spectral/temporal domain (see ticket #43713)
-
+ - pkextract
+	extracting with absolute threshold (negative value) was selecting 1 extra sample unit
 Todo:
  - todo for API
 	ImgReaderGdal (ImgWriterGdal) open in update mode (check gdal_edit.py: http://searchcode.com/codesearch/view/18938404)
diff --git a/src/apps/pkextract.cc b/src/apps/pkextract.cc
index 8ec5bd6..d878fa2 100644
--- a/src/apps/pkextract.cc
+++ b/src/apps/pkextract.cc
@@ -421,7 +421,7 @@ int main(int argc, char *argv[])
 		  continue;//do not select for now, go to next column
               }
               else if(nvalid.size()>processClass){//absolute value
-                if(nvalid[processClass]>-theThreshold)
+                if(nvalid[processClass]>=-theThreshold)
                   continue;//do not select any more pixels for this class, go to next column to search for other classes
               }
 	      writeBuffer.push_back(sample);
@@ -614,7 +614,7 @@ int main(int argc, char *argv[])
                   continue;//do not select for now, go to next column
               }
               else if(nvalid.size()>processClass){//absolute value
-                if(nvalid[processClass]>-theThreshold)
+                if(nvalid[processClass]>=-theThreshold)
                   continue;//do not select any more pixels for this class, go to next column to search for other classes
               }
               writeBuffer.push_back(sample);
@@ -812,7 +812,7 @@ int main(int argc, char *argv[])
 	  }
 	}
 	else{//absolute value
-	  if(ntotalvalid>-threshold_opt[0]){
+	  if(ntotalvalid>=-threshold_opt[0]){
 	    if(test_opt.size())
 	      writeTest=true;
 	    else
diff --git a/src/apps/pksvm.cc b/src/apps/pksvm.cc
index 0745a52..bfd02d5 100644
--- a/src/apps/pksvm.cc
+++ b/src/apps/pksvm.cc
@@ -614,8 +614,8 @@ int main(int argc, char *argv[])
         if(verbose_opt[0]>=1)
           std::cout << "opening mask image file " << mask_opt[0] << std::endl;
         maskReader.open(mask_opt[0]);
-        assert(maskReader.nrOfCol()==testImage.nrOfCol());
-        assert(maskReader.nrOfRow()==testImage.nrOfRow());
+        // assert(maskReader.nrOfCol()==testImage.nrOfCol());
+        // assert(maskReader.nrOfRow()==testImage.nrOfRow());
       }
       catch(string error){
         cerr << error << std::endl;
@@ -699,8 +699,6 @@ int main(int argc, char *argv[])
     for(int iline=0;iline<nrow;++iline){
       vector<float> buffer(ncol);
       vector<short> lineMask;
-      if(mask_opt.size())
-        lineMask.resize(maskReader.nrOfCol());
       Vector2d<float> linePrior;
       if(priorimg_opt.size())
 	 linePrior.resize(nclass,ncol);//prior prob for each class
@@ -745,20 +743,6 @@ int main(int argc, char *argv[])
       assert(nband==hpixel[0].size());
       if(verbose_opt[0]>1)
         std::cout << "used bands: " << nband << std::endl;
-      //read mask
-      if(!lineMask.empty()){
-        try{
-          maskReader.readData(lineMask,GDT_Int16,iline);
-        }
-        catch(string theError){
-          cerr << "Error reading " << mask_opt[0] << ": " << theError << std::endl;
-          exit(3);
-        }
-        catch(...){
-          cerr << "error catched" << std::endl;
-          exit(3);
-        }
-      }
       //read prior
       if(priorimg_opt.size()){
         try{
@@ -777,39 +761,70 @@ int main(int argc, char *argv[])
           exit(3);
         }
       }
+      double oldRowMask=-1;//keep track of row mask to optimize number of line readings
       //process per pixel
       for(int icol=0;icol<ncol;++icol){
         assert(hpixel[icol].size()==nband);
         bool masked=false;
-        if(!lineMask.empty()){
-          short theMask=0;
-          for(short ivalue=0;ivalue<msknodata_opt.size();++ivalue){
-            if(msknodata_opt[ivalue]>=0){//values set in msknodata_opt are invalid
-              if(lineMask[icol]==msknodata_opt[ivalue]){
-                theMask=lineMask[icol];
-                masked=true;
-                break;
-              }
-            }
-            else{//only values set in msknodata_opt are valid
-              if(lineMask[icol]!=-msknodata_opt[ivalue]){
-                theMask=lineMask[icol];
-                masked=true;
-              }
-              else{
-                masked=false;
-                break;
-              }
-            }
-          }
-          if(masked){
-            if(classBag_opt.size())
-              for(int ibag=0;ibag<nbag;++ibag)
-                classBag[ibag][icol]=theMask;
-            classOut[icol]=theMask;
-            continue;
-          }
-        }
+        if(mask_opt.size()){
+	  //read mask
+	  double colMask=0;
+	  double rowMask=0;
+	  double geox=0;
+	  double geoy=0;
+
+	  testImage.image2geo(icol,iline,geox,geoy);
+	  maskReader.geo2image(geox,geoy,colMask,rowMask);
+	  colMask=static_cast<int>(colMask);
+	  rowMask=static_cast<int>(rowMask);
+	  if(rowMask>=0&&rowMask<maskReader.nrOfRow()&&colMask>=0&&colMask<maskReader.nrOfCol()){
+	    if(static_cast<int>(rowMask)!=static_cast<int>(oldRowMask)){
+	      assert(rowMask>=0&&rowMask<maskReader.nrOfRow());
+	      try{
+		// maskReader.readData(lineMask[imask],GDT_Int32,static_cast<int>(rowMask));
+		maskReader.readData(lineMask,GDT_Int16,static_cast<int>(rowMask));
+	      }
+	      catch(string errorstring){
+		cerr << errorstring << endl;
+		exit(1);
+	      }
+	      catch(...){
+		cerr << "error catched" << std::endl;
+		exit(3);
+	      }
+	      oldRowMask=rowMask;
+	    }
+	  }
+	  else
+	    continue;//no coverage in this mask
+	  short theMask=0;
+	  for(short ivalue=0;ivalue<msknodata_opt.size();++ivalue){
+	    if(msknodata_opt[ivalue]>=0){//values set in msknodata_opt are invalid
+	      if(lineMask[colMask]==msknodata_opt[ivalue]){
+		theMask=lineMask[colMask];
+		masked=true;
+		break;
+	      }
+	    }
+	    else{//only values set in msknodata_opt are valid
+	      if(lineMask[icol]!=-msknodata_opt[ivalue]){
+		theMask=lineMask[colMask];
+		masked=true;
+	      }
+	      else{
+		masked=false;
+		break;
+	      }
+	    }
+	  }
+	  if(masked){
+	    if(classBag_opt.size())
+	      for(int ibag=0;ibag<nbag;++ibag)
+		classBag[ibag][icol]=theMask;
+	    classOut[icol]=theMask;
+	    continue;
+	  }
+	}
         bool valid=false;
         for(int iband=0;iband<hpixel[icol].size();++iband){
           if(hpixel[icol][iband]){

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