[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