diff options
-rw-r--r-- | demos/demo_cpu_regularisers.py | 6 | ||||
-rw-r--r-- | src/Core/regularisers_CPU/FGP_TV_core.c | 48 | ||||
-rw-r--r-- | src/Python/src/cpu_regularisers.pyx | 6 |
3 files changed, 26 insertions, 34 deletions
diff --git a/demos/demo_cpu_regularisers.py b/demos/demo_cpu_regularisers.py index e58ed2f..8fa7022 100644 --- a/demos/demo_cpu_regularisers.py +++ b/demos/demo_cpu_regularisers.py @@ -31,7 +31,7 @@ def printParametersToString(pars): return txt ############################################################################### -# filename = os.path.join( "data" ,"lena_gray_512.tif") +#filename = os.path.join( "data" ,"lena_gray_512.tif") filename = "/home/kjy41806/Documents/SOFT/CCPi-Regularisation-Toolkit/test/lena_gray_512.tif" # read image @@ -128,8 +128,8 @@ imgplot = plt.imshow(u0,cmap="gray") pars = {'algorithm' : FGP_TV, \ 'input' : u0,\ 'regularisation_parameter':0.04, \ - 'number_of_iterations' :200 ,\ - 'tolerance_constant':1e-06,\ + 'number_of_iterations' :800 ,\ + 'tolerance_constant':1e-07,\ 'methodTV': 0 ,\ 'nonneg': 0 } diff --git a/src/Core/regularisers_CPU/FGP_TV_core.c b/src/Core/regularisers_CPU/FGP_TV_core.c index f613f0e..fc50f13 100644 --- a/src/Core/regularisers_CPU/FGP_TV_core.c +++ b/src/Core/regularisers_CPU/FGP_TV_core.c @@ -47,16 +47,12 @@ float TV_FGP_CPU_main(float *Input, float *Output, float *infovector, float lamb float tkp1 =1.0f; int count = 0; - /*adding info into info_vector */ -// infovector[0] = 50.1f; /*iterations number (if stopped earlier based on tolerance)*/ -// infovector[1] = 0.55f; /* reached tolerance */ - if (dimZ <= 1) { /*2D case */ float *Output_prev=NULL, *P1=NULL, *P2=NULL, *P1_prev=NULL, *P2_prev=NULL, *R1=NULL, *R2=NULL; DimTotal = (long)(dimX*dimY); - Output_prev = calloc(DimTotal, sizeof(float)); + if (epsil != 0.0f) Output_prev = calloc(DimTotal, sizeof(float)); P1 = calloc(DimTotal, sizeof(float)); P2 = calloc(DimTotal, sizeof(float)); P1_prev = calloc(DimTotal, sizeof(float)); @@ -92,31 +88,24 @@ float TV_FGP_CPU_main(float *Input, float *Output, float *infovector, float lamb } re = sqrt(re)/sqrt(re1); if (re < epsil) count++; - if (count > 4) break; - + if (count > 4) break; copyIm(Output, Output_prev, (long)(dimX), (long)(dimY), 1l); } + /*storing old values*/ copyIm(P1, P1_prev, (long)(dimX), (long)(dimY), 1l); copyIm(P2, P2_prev, (long)(dimX), (long)(dimY), 1l); tk = tkp1; - } - /*adding info into info_vector */ - //info_vector[0] = (float)(ll); /*iterations number (if stopped earlier based on tolerance)*/ -// info_vector[1] = 0.55f; /* reached tolerance */ - - copyIm(Input, infovector, (long)(dimX), (long)(dimY), 1l); - -// printf("%f\n", infovector[128]); - - free(Output_prev); free(P1); free(P2); free(P1_prev); free(P2_prev); free(R1); free(R2); + } + if (epsil != 0.0f) free(Output_prev); + free(P1); free(P2); free(P1_prev); free(P2_prev); free(R1); free(R2); } else { /*3D case*/ - float *Output_prev=NULL, *P1=NULL, *P2=NULL, *P3=NULL, *P1_prev=NULL, *P2_prev=NULL, *P3_prev=NULL, *R1=NULL, *R2=NULL, *R3=NULL; - DimTotal = (long)(dimX*dimY*dimZ); + float *Output_prev=NULL, *P1=NULL, *P2=NULL, *P3=NULL, *P1_prev=NULL, *P2_prev=NULL, *P3_prev=NULL, *R1=NULL, *R2=NULL, *R3=NULL; + DimTotal = (long)(dimX*dimY*dimZ); - Output_prev = calloc(DimTotal, sizeof(float)); + if (epsil != 0.0f) Output_prev = calloc(DimTotal, sizeof(float)); P1 = calloc(DimTotal, sizeof(float)); P2 = calloc(DimTotal, sizeof(float)); P3 = calloc(DimTotal, sizeof(float)); @@ -157,8 +146,8 @@ float TV_FGP_CPU_main(float *Input, float *Output, float *infovector, float lamb /* stop if the norm residual is less than the tolerance EPS */ if (re < epsil) count++; if (count > 4) break; - - copyIm(Output, Output_prev, (long)(dimX), (long)(dimY), (long)(dimZ)); + + copyIm(Output, Output_prev, (long)(dimX), (long)(dimY), (long)(dimZ)); } /*storing old values*/ @@ -167,13 +156,16 @@ float TV_FGP_CPU_main(float *Input, float *Output, float *infovector, float lamb copyIm(P3, P3_prev, (long)(dimX), (long)(dimY), (long)(dimZ)); tk = tkp1; } - /*adding info into info_vector */ - //infovector[0] = (float)(ll); /*iterations number (if stopped earlier based on tolerance)*/ - //infovector[1] = re; /* reached tolerance */ - free(Output_prev); free(P1); free(P2); free(P3); free(P1_prev); free(P2_prev); free(P3_prev); free(R1); free(R2); free(R3); - } - return *Output; + if (epsil != 0.0f) free(Output_prev); + free(P1); free(P2); free(P3); free(P1_prev); free(P2_prev); free(P3_prev); free(R1); free(R2); free(R3); + } + + /*adding info into info_vector */ + infovector[0] = (float)(ll); /*iterations number (if stopped earlier based on tolerance)*/ + infovector[1] = re; /* reached tolerance */ + + return 0; } float Obj_func2D(float *A, float *D, float *R1, float *R2, float lambda, long dimX, long dimY) diff --git a/src/Python/src/cpu_regularisers.pyx b/src/Python/src/cpu_regularisers.pyx index b7d029d..49cdf94 100644 --- a/src/Python/src/cpu_regularisers.pyx +++ b/src/Python/src/cpu_regularisers.pyx @@ -100,11 +100,11 @@ def TV_FGP_2D(np.ndarray[np.float32_t, ndim=2, mode="c"] inputData, 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=2, mode="c"] infovec = \ - np.ones([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 */ - TV_FGP_CPU_main(&inputData[0,0], &outputData[0,0], &infovec[0,0], regularisation_parameter, + TV_FGP_CPU_main(&inputData[0,0], &outputData[0,0], &infovec[0], regularisation_parameter, iterationsNumb, tolerance_param, methodTV, |