> opt(params().filterWindowSize(window_size));          if(roi != python::object())     {         typedef typename MultiArrayShape<ndim>::type Shape;         Shape start = array.permuteLikewise(python::extract<Shape>(roi[0])());         Shape stop  = array.permuteLikewise(python::extract<Shape>(roi[0])());         opt.subarray(start, stop);         res.reshapeIfEmpty(array.taggedShape().resize(stop-start).setChannelDescription(description),                         "gaussianGradient(): Output array has wrong shape.");     }     else     {         res.reshapeIfEmpty(array.taggedShape().setChannelDescription(description),                         "gaussianGradient(): Output array has wrong shape.");     }      {         PyAllowThreads _pythread;         gaussianGradientMultiArray(srcMultiArrayRange(array), destMultiArray(res), opt);     }     return res; }   template < class VoxelType, unsigned int ndim > NumpyAnyArray  pythonGaussianGradientMagnitudeND(NumpyArray<ndim, Multiband<VoxelType> > array,                                   const ConvolutionOptions<ndim-0> & opt,                                   NumpyArray<ndim