// On place apply for type channel8!
  bool distanceTransform::apply(channel& srcdest) const {

    if ((srcdest.rows() < 2) || (srcdest.columns() < 2)) {
      setStatusString("At least 2 pixels at each axis expected");
      return false;
    }

    const parameters& param = getParameters();

    if(   param.distance == parameters::EightNeighborhood
       || param.distance == parameters::FourNeighborhood){
      // ensure that the non-zero values are maximal
      int y;
      vector<channel::value_type>::iterator it,eit;
      const float max = static_cast<float>(srcdest.rows()+srcdest.columns());
      for (y=0;y<srcdest.rows();y++) {
        vector<channel::value_type>& vct = srcdest.getRow(y);
        for (it=vct.begin(),eit=vct.end();it!=eit;++it) {
          if ((*it)>0.0f) {
            (*it)=max;
          }
        }
      }
    }

    switch(param.distance){
    case parameters::EightNeighborhood:
      
      iteration8back(srcdest);
      iteration8(srcdest);
      return true;

    case parameters::FourNeighborhood:
      
      iteration4back(srcdest);
      iteration4(srcdest);
      return true;

    case parameters::Euclidean:
      
      EDT_1D(srcdest);
      EDT_2D(srcdest);
      srcdest.apply(sqrt);
      return true;

    case parameters::EuclideanSqr:

      EDT_1D(srcdest);
      EDT_2D(srcdest);
      return true;

    case parameters::EightSED:
    
      sedFiltering(srcdest, true);
      srcdest.apply(sqrt);
      return true;
    
    case parameters::EightSEDSqr:

      sedFiltering(srcdest,true);
      return true;

    case parameters::FourSED:

      sedFiltering(srcdest, false);
      srcdest.apply(sqrt);
      return true;

    case parameters::FourSEDSqr:

      sedFiltering(srcdest, false);
      return true;

    default:
      return false;
    }
  };