diff options
Diffstat (limited to 'src/Python')
| -rw-r--r-- | src/Python/ccpi/filters/regularisers.py | 28 | ||||
| -rw-r--r-- | src/Python/setup-regularisers.py.in | 25 | ||||
| -rw-r--r-- | src/Python/src/cpu_regularisers.pyx | 42 | 
3 files changed, 78 insertions, 17 deletions
diff --git a/src/Python/ccpi/filters/regularisers.py b/src/Python/ccpi/filters/regularisers.py index 0b5b2ee..d65c0b9 100644 --- a/src/Python/ccpi/filters/regularisers.py +++ b/src/Python/ccpi/filters/regularisers.py @@ -2,7 +2,7 @@  script which assigns a proper device core function based on a flag ('cpu' or 'gpu')  """ -from ccpi.filters.cpu_regularisers import TV_ROF_CPU, TV_FGP_CPU, TV_SB_CPU, dTV_FGP_CPU, TNV_CPU, NDF_CPU, Diff4th_CPU, TGV_CPU, LLT_ROF_CPU, PATCHSEL_CPU, NLTV_CPU +from ccpi.filters.cpu_regularisers import TV_ROF_CPU, TV_FGP_CPU, TV_PD_CPU, TV_SB_CPU, dTV_FGP_CPU, TNV_CPU, NDF_CPU, Diff4th_CPU, TGV_CPU, LLT_ROF_CPU, PATCHSEL_CPU, NLTV_CPU  try:      from ccpi.filters.gpu_regularisers import TV_ROF_GPU, TV_FGP_GPU, TV_SB_GPU, dTV_FGP_GPU, NDF_GPU, Diff4th_GPU, TGV_GPU, LLT_ROF_GPU, PATCHSEL_GPU      gpu_enabled = True @@ -51,6 +51,31 @@ def FGP_TV(inputData, regularisation_parameter,iterations,              raise ValueError ('GPU is not available')          raise ValueError('Unknown device {0}. Expecting gpu or cpu'\                           .format(device)) + +def PD_TV(inputData, regularisation_parameter, iterations, +                     tolerance_param, methodTV, nonneg, lipschitz_const, device='cpu'): +    if device == 'cpu': +        return TV_PD_CPU(inputData, +                     regularisation_parameter, +                     iterations, +                     tolerance_param, +                     methodTV, +                     nonneg, +                     lipschitz_const) +    elif device == 'gpu' and gpu_enabled: +        return TV_PD_CPU(inputData, +                     regularisation_parameter, +                     iterations, +                     tolerance_param, +                     methodTV, +                     nonneg, +                     lipschitz_const) +    else: +        if not gpu_enabled and device == 'gpu': +            raise ValueError ('GPU is not available') +        raise ValueError('Unknown device {0}. Expecting gpu or cpu'\ +                         .format(device)) +  def SB_TV(inputData, regularisation_parameter, iterations,                       tolerance_param, methodTV, device='cpu'):      if device == 'cpu': @@ -212,4 +237,3 @@ def NDF_INP(inputData, maskData, regularisation_parameter, edge_parameter, itera  def NVM_INP(inputData, maskData, SW_increment, iterations):          return NVM_INPAINT_CPU(inputData, maskData, SW_increment, iterations) - diff --git a/src/Python/setup-regularisers.py.in b/src/Python/setup-regularisers.py.in index 4c578e3..9bcd46d 100644 --- a/src/Python/setup-regularisers.py.in +++ b/src/Python/setup-regularisers.py.in @@ -8,13 +8,13 @@ from Cython.Distutils import build_ext  import os  import sys  import numpy -import platform	 +import platform  cil_version=os.environ['CIL_VERSION']  if  cil_version == '':      print("Please set the environmental variable CIL_VERSION")      sys.exit(1) -	 +  library_include_path = ""  library_lib_path = ""  try: @@ -23,7 +23,7 @@ try:  except:      library_include_path = os.environ['PREFIX']+'/include'      pass -     +  extra_include_dirs = [numpy.get_include(), library_include_path]  #extra_library_dirs = [os.path.join(library_include_path, "..", "lib")]  extra_compile_args = [] @@ -38,6 +38,7 @@ extra_include_dirs += [os.path.join(".." , "Core"),                         os.path.join(".." , "Core",  "regularisers_CPU"),                         os.path.join(".." , "Core",  "inpainters_CPU"),                         os.path.join(".." , "Core",  "regularisers_GPU" , "TV_FGP" ) , +                       os.path.join(".." , "Core",  "regularisers_GPU" , "TV_PD" ) ,                         os.path.join(".." , "Core",  "regularisers_GPU" , "TV_ROF" ) ,                         os.path.join(".." , "Core",  "regularisers_GPU" , "TV_SB" ) ,                         os.path.join(".." , "Core",  "regularisers_GPU" , "TGV" ) , @@ -48,12 +49,12 @@ extra_include_dirs += [os.path.join(".." , "Core"),                         os.path.join(".." , "Core",  "regularisers_GPU" , "PatchSelect" ) ,  						   "."] -if platform.system() == 'Windows':				    -    extra_compile_args[0:] = ['/DWIN32','/EHsc','/DBOOST_ALL_NO_LIB' , '/openmp' ]    +if platform.system() == 'Windows': +    extra_compile_args[0:] = ['/DWIN32','/EHsc','/DBOOST_ALL_NO_LIB' , '/openmp' ]  else:      extra_compile_args = ['-fopenmp','-O2', '-funsigned-char', '-Wall', '-std=c++0x']      extra_libraries += [@EXTRA_OMP_LIB@] -     +  setup(      name='ccpi',  	description='CCPi Core Imaging Library - Image regularisers', @@ -61,13 +62,13 @@ setup(      cmdclass = {'build_ext': build_ext},      ext_modules = [Extension("ccpi.filters.cpu_regularisers",                               sources=[os.path.join("." , "src", "cpu_regularisers.pyx" ) ], -                             include_dirs=extra_include_dirs,  -							 library_dirs=extra_library_dirs,  -							 extra_compile_args=extra_compile_args,  -							 libraries=extra_libraries ),  -     +                             include_dirs=extra_include_dirs, +							 library_dirs=extra_library_dirs, +							 extra_compile_args=extra_compile_args, +							 libraries=extra_libraries ), +      ], -	zip_safe = False,	 +	zip_safe = False,  	packages = {'ccpi', 'ccpi.filters', 'ccpi.supp'},  ) diff --git a/src/Python/src/cpu_regularisers.pyx b/src/Python/src/cpu_regularisers.pyx index 4917d06..724634b 100644 --- a/src/Python/src/cpu_regularisers.pyx +++ b/src/Python/src/cpu_regularisers.pyx @@ -20,6 +20,7 @@ cimport numpy as np  cdef extern float TV_ROF_CPU_main(float *Input, float *Output, float *infovector, float *lambdaPar, int lambda_is_arr, int iterationsNumb, float tau, float epsil, int dimX, int dimY, int dimZ);  cdef extern float TV_FGP_CPU_main(float *Input, float *Output, float *infovector, float lambdaPar, int iterationsNumb, float epsil, int methodTV, int nonneg, int dimX, int dimY, int dimZ); +cdef extern float PDTV_CPU_main(float *Input, float *U, float *infovector, float lambdaPar, int iterationsNumb, float epsil, float lipschitz_const, int methodTV, int nonneg, int dimX, int dimY, int dimZ);  cdef extern float SB_TV_CPU_main(float *Input, float *Output, float *infovector, float mu, int iter, float epsil, int methodTV, int dimX, int dimY, int dimZ);  cdef extern float LLT_ROF_CPU_main(float *Input, float *Output, float *infovector, float lambdaROF, float lambdaLLT, int iterationsNumb, float tau, float epsil, int dimX, int dimY, int dimZ);  cdef extern float TGV_main(float *Input, float *Output, float *infovector, float lambdaPar, float alpha1, float alpha0, int iterationsNumb, float L2, float epsil, int dimX, int dimY, int dimZ); @@ -58,9 +59,6 @@ def TV_ROF_2D(np.ndarray[np.float32_t, ndim=2, mode="c"] inputData,      cdef np.ndarray[np.float32_t, ndim=1, mode="c"] infovec = \              np.ones([2], dtype='float32') -    # Run ROF iterations for 2D data -    # TV_ROF_CPU_main(&inputData[0,0], &outputData[0,0], &infovec[0], regularisation_parameter, iterationsNumb, marching_step_parameter, tolerance_param, dims[1], dims[0], 1) -     # Run ROF iterations for 2D data      if isinstance (regularisation_parameter, np.ndarray):          reg = regularisation_parameter.copy()          TV_ROF_CPU_main(&inputData[0,0], &outputData[0,0], &infovec[0], ®[0,0],  1, iterationsNumb, marching_step_parameter, tolerance_param, dims[1], dims[0], 1) @@ -158,6 +156,44 @@ def TV_FGP_3D(np.ndarray[np.float32_t, ndim=3, mode="c"] inputData,                         dims[2], dims[1], dims[0])      return (outputData,infovec) +#****************************************************************# +#****************** Total-variation Primal-dual *****************# +#****************************************************************# +def TV_PD_CPU(inputData, regularisation_parameter, iterationsNumb, tolerance_param, methodTV, nonneg, lipschitz_const): +    if inputData.ndim == 2: +        return TV_PD_2D(inputData, regularisation_parameter, iterationsNumb, tolerance_param, methodTV, nonneg, lipschitz_const) +    elif inputData.ndim == 3: +        return 0 + +def TV_PD_2D(np.ndarray[np.float32_t, ndim=2, mode="c"] inputData, +                     float regularisation_parameter, +                     int iterationsNumb, +                     float tolerance_param, +                     int methodTV, +                     int nonneg, +                     float lipschitz_const): + +    cdef long dims[2] +    dims[0] = inputData.shape[0] +    dims[1] = inputData.shape[1] + +    cdef np.ndarray[np.float32_t, ndim=2, mode="c"] outputData = \ +            np.zeros([dims[0],dims[1]], dtype='float32') + +    cdef np.ndarray[np.float32_t, ndim=1, mode="c"] infovec = \ +            np.ones([2], dtype='float32') + +    #/* Run FGP-TV iterations for 2D data */ +    PDTV_CPU_main(&inputData[0,0], &outputData[0,0], &infovec[0], regularisation_parameter, +                       iterationsNumb, +                       tolerance_param, +                       lipschitz_const, +                       methodTV, +                       nonneg, +                       dims[1],dims[0], 1) + +    return (outputData,infovec) +  #***************************************************************#  #********************** Total-variation SB *********************#  #***************************************************************#  | 
