// Kernel_Optimization.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include #include #include #include "time.h" void initialize_psi_vector(long** psi_vector, long** N_psi_vector, long **gamma_vector); long proj_optim_l1_norm_for_edges(double *f_opt,double *Z_opt, double *h, double *new_he, double *new_ve, double *new_de, double *new_dre, long N, long M, long k01, long k02, long k03, long k04, double * Z, double *Kappa, double lambda,double b0, double b1, double epsilon0, double *rho1, double *rho2, double *rho3, double *rho4,double slope, double mu); long proj_optim_l1_norm_for_edges2(double *f_opt,double *Z_opt, double *h, double *new_he, double *new_ve, double *new_de, double *new_dre, long N, long M, long k01, long k02, long k03, long k04, double * Z, double *Kappa, double lambda,double b0, double b1, double epsilon0, double *rho1, double *rho2, double *rho3, double *rho4,double slope, double mu,double mu2); long proj_optim_l1_norm(double *f_opt,double *Z_opt, double *h, long N, long M, double *Z, double *Kappa, double lambda,double b0, double b1, double epsilon0); long proj_optim_l1_l2_norm_semi_parametric(/*outputs*/double *f_opt,double *Z_opt, double *h, double *b_psi, /*inputs*/long *psi, double *gamma, short *psi_used, double *Z, double *Kappa, long N, long N_psi, double lambda,double b0, double b1, double epsilon0, double mu, double mu2,double E1, double E2); long proj_optim_l1_l2_norm_semi_parametric(/*outputs*/double *f_opt,double *Z_opt, double *h, double *b_psi, /*inputs*/long *psi, double *gamma, short *psi_used, double *Z, double *Kappa, long N, long N_psi, double lambda,double b0, double b1, double epsilon0, double mu, double mu2,double E1, double E2); long proj_optim_l1_l1_norm_semi_parametric(/*outputs*/double *f_opt,double *Z_opt, double *h, double *b_psi, /*inputs*/long *psi, double *gamma, short *psi_used, double *Z, double *Kappa, long N, long N_psi, double lambda,double b0, double b1, double epsilon0, double mu, double mu2,double E1, double E2); long progressive_proj_optim_l1_l2_norm_semi_parametric(/*outputs*/double *f_opt,double *Z_opt, double *h, double *b_psi, /*inputs*/long *psi, double *gamma, short *psi_used, double *Z, double *Kappa, long N, long N_psi, double lambda,double b0, double b1, double epsilon0, double mu, double mu2, double E1, double E2,short keep); void Kernel_Denoising(double *return_pic, double *ori_pic, long M0, long N0, long n, long steps, double lambda_min, double lambda_max, double sigma_min, double sigma_max,double b0, double b1, double epsilon0, double initial_mu, double *mu_vector, long LEN_mu, double *per_vector, long *n_vector, long *method_vector, long *iter_pixel_step); void Kernel_Denoising_semi_parametric(/*output*/double *return_pic, /*inputs*/double *ori_pic, long M0, long N0, long n, long steps, double lambda, double sigma,double b0, double b1, double epsilon0, double initial_mu, double *mu_vector, double *mu2_vector, double *calc_type, long LEN_mu, double *per_vector, long *n_vector, long *method_vector, long *iter_pixel_step, long *psi_vector, long *N_psi_vector, long *gamma_vector); void fix_edge_values(double *pic, double* edge_value, int M0, int N0, int n, int k_max,double b0, double b1); void replace_with_min_in_window(double* buffer, int M0, int N0, int n); void image_extend(double *pic,double *ori_pic, long M0, long N0, long m, long n); void window_median_grad_calc(double *med_grad, double *im, long M, long N, long n1, long n2); void window_max_grad_calc(double *med_grad, double *im, long M, long N, long n1, long n2); void window_norm_grad_calc(double *med_grad, double *im, long M, long N, long n1, long n2); void norm_grad_calc(double *grad, double *im, long M, long N); double PSNR_calc(double *Im1, double *Im2,long N,double R); long doubles_compare(const double * x, const double *y); void RKHS_eval(double *f_val, double *f, double *Kappa, long M, long N); double RKHS_norm(double *f, double *Kappa, long N, long M); double mean_value2D(double *Z, long N, long M); void zero_filling(double *mem, long N); void constant_filling_short(short *mem, short c, long N); void zero_filling_long(long *mem, long N); double square_sum1D(double *A, long N); double sum1D(double *A, long N); double find_max(double *vector, long N); long find_max_long(long *vector, long N); double sign(double x); double signbit(double x); double erf1(double x); double erf(double x); double erfc(double x); double round(double); void initialize_psi_vector(long** psi_vector, long** N_psi_vector, long **gamma_vector){ int V=6; int l0,l1,l,l2; long i,j,k,v,n; double* *psi; double *gamma; double x[20],y[20],slope; *psi_vector=(long*)malloc(V*sizeof(long)); *N_psi_vector=(long*)malloc(V*sizeof(long)); *gamma_vector=(long*)malloc(V*sizeof(long)); /*for v=0*/ v=0; n=3; (*N_psi_vector)[v]=10; psi=(double**)malloc( (*N_psi_vector)[v]*sizeof(long) ); gamma=(double*)malloc( (*N_psi_vector)[v]*sizeof(double) ); (*psi_vector)[v]=psi; (*gamma_vector)[v]=gamma; /*Construct the 3x3 functions*/ psi[0]=(double*)malloc( n*n*sizeof(double) ); gamma[0]=1; psi[0][0]=-1; psi[0][1]=1; psi[0][2]=1; psi[0][3]=-1; psi[0][4]=1; psi[0][5]=1; psi[0][6]=-1; psi[0][7]=1; psi[0][8]=1; psi[1]=(double*)malloc( n*n*sizeof(double) ); gamma[1]=1; psi[1][0]=-1; psi[1][1]=-1; psi[1][2]=1; psi[1][3]=-1; psi[1][4]=-1; psi[1][5]=1; psi[1][6]=-1; psi[1][7]=-1; psi[1][8]=1; psi[2]=(double*)malloc( n*n*sizeof(double) ); gamma[2]=1; psi[2][0]=-1; psi[2][1]=-1; psi[2][2]=-1; psi[2][3]=1; psi[2][4]=1; psi[2][5]=1; psi[2][6]=1; psi[2][7]=1; psi[2][8]=1; psi[3]=(double*)malloc( n*n*sizeof(double) ); gamma[3]=1; psi[3][0]=-1; psi[3][1]=-1; psi[3][2]=-1; psi[3][3]=-1; psi[3][4]=-1; psi[3][5]=-1; psi[3][6]=1; psi[3][7]=1; psi[3][8]=1; psi[4]=(double*)malloc( n*n*sizeof(double) ); gamma[4]=1; psi[4][0]=1; psi[4][1]=-1; psi[4][2]=-1; psi[4][3]=1; psi[4][4]=1; psi[4][5]=-1; psi[4][6]=1; psi[4][7]=1; psi[4][8]=1; psi[5]=(double*)malloc( n*n*sizeof(double) ); gamma[5]=1; psi[5][0]=-1; psi[5][1]=-1; psi[5][2]=-1; psi[5][3]=1; psi[5][4]=-1; psi[5][5]=-1; psi[5][6]=1; psi[5][7]=1; psi[5][8]=-1; psi[6]=(double*)malloc( n*n*sizeof(double) ); gamma[6]=1; psi[6][0]=-1; psi[6][1]=-1; psi[6][2]=1; psi[6][3]=-1; psi[6][4]=1; psi[6][5]=1; psi[6][6]=1; psi[6][7]=1; psi[6][8]=1; psi[7]=(double*)malloc( n*n*sizeof(double) ); gamma[7]=1; psi[7][0]=-1; psi[7][1]=-1; psi[7][2]=-1; psi[7][3]=-1; psi[7][4]=-1; psi[7][5]=1; psi[7][6]=-1; psi[7][7]=1; psi[7][8]=1; psi[8]=(double*)malloc( n*n*sizeof(double) ); gamma[8]=1; psi[8][0]=0; psi[8][1]=2; psi[8][2]=0; psi[8][3]=0; psi[8][4]=2; psi[8][5]=0; psi[8][6]=0; psi[8][7]=2; psi[8][8]=0; psi[9]=(double*)malloc( n*n*sizeof(double) ); gamma[9]=1; psi[9][0]=0; psi[9][1]=0; psi[9][2]=0; psi[9][3]=2; psi[9][4]=2; psi[9][5]=2; psi[9][6]=0; psi[9][7]=0; psi[9][8]=0; /********************************************************************/ /*for v=1*/ /*********************************************************************/ v=1; n=5; (*N_psi_vector)[v]=44; psi=(double**)malloc( (*N_psi_vector)[v]*sizeof(long) ); gamma=(double*)malloc( (*N_psi_vector)[v]*sizeof(double) ); (*psi_vector)[v]=psi; (*gamma_vector)[v]=gamma; for(i=0;i*y) return 1; else return -1; } double round(double x){ if (ceil(x)-x>x-floor(x)) return floor(x); else return ceil(x); } double find_max(double *vector, long N) { double max; long i; max=vector[0]; for(i=1;imax) max=vector[i]; } return max; } double find_min(double *vector, long N) { double min; long i; min=vector[0]; for(i=1;imax) max=vector[i]; } return max; } void zero_filling(double *mem, long N){ long i; for (i=0;i 15 figures (assuming usual 52 bit mantissa in a double) double signbit(double x){ if (x<0) return 1; else return 0; } double erf(double x) { if (x>0) return erf1(x); else return -erf1(-x); } double erf1(double x) //erf(x) = 2/sqrt(pi)*integral(exp(-t^2),t,0,x) // = 2/sqrt(pi)*[x - x^3/3 + x^5/5*2! - x^7/7*3! + ...] // = 1-erfc(x) { static const double two_sqrtpi= 1.128379167095512574; // 2/sqrt(pi) double sum= x, term= x, xsqr= x*x; long j= 1; if (fabs(x) > 2.2) { return 1.0 - erfc(x); //use continued fraction when fabs(x) > 2.2 } do { term*= xsqr/j; sum-= term/(2*j+1); ++j; term*= xsqr/j; sum+= term/(2*j+1); ++j; } while (fabs(term)/sum > rel_error); return two_sqrtpi*sum; } double erfc(double x) //erfc(x) = 2/sqrt(pi)*integral(exp(-t^2),t,x,inf) // = exp(-x^2)/sqrt(pi) * [1/x+ (1/2)/x+ (2/2)/x+ (3/2)/x+ (4/2)/x+ ...] // = 1-erf(x) //expression inside [] is a continued fraction so '+' means add to denominator only { static const double one_sqrtpi= 0.564189583547756287; // 1/sqrt(pi) double a=1, b=x; //last two convergent numerators double c=x, d=x*x+0.5; //last two convergent denominators double q1, q2= b/d; //last two convergents (a/c and b/d) double n= 1.0, t; if (fabs(x) < 2.2) { return 1.0 - erf1(x); //use series when fabs(x) < 2.2 } if (signbit(x)) { //continued fraction only valid for x>0 return 2.0 - erfc(-x); } do { t= a*n+b*x; a= b; b= t; t= c*n+d*x; c= d; d= t; n+= 0.5; q1= q2; q2= b/d; } while (fabs(q1-q2)/q2 > rel_error); return one_sqrtpi*exp(-x*x)*q2; } /***************************************************************/ double sign(double x){ if (x>=0){ if (x==0) return 0; else return +1; } else return -1; } double square_sum1D(double *A, long N){ long i; double sum=0; for(i=0;imax) max=grad[(i+k-1)*N+j+l-1]; med_grad[(i0)*N0+j0]=max; j0++; } i0++; } free(grad); } void window_norm_grad_calc(double *med_grad, double *im, long M, long N, long n1, long n2){ double *grad=(double*)malloc(M*N*sizeof(double)); long i,j,k,l,i0,j0,N0=N-n1+1; double max; norm_grad_calc(grad, im, M, N); i0=0; for (i=1+(long)floor(n1/2);i<=M-(long)floor(n1/2);i++){ j0=0; for(j=1+(long)floor(n1/2);j<=N-(long)floor(n1/2);j++){ med_grad[(i0)*N0+j0]=grad[(i-1)*N+j-1]; j0++; } i0++; } free(grad); } /*optimization methods*/ long proj_optim_l1_norm_for_edges(double *f_opt,double *Z_opt, double *h, double *new_he, double *new_ve, double *new_de, double *new_dre, long N, long M, long k01, long k02, long k03, long k04, double *Z, double *Kappa, double lambda,double b0, double b1, double epsilon0, double *rho1, double *rho2, double *rho3, double *rho4,double slope, double mu) { double E1=b1/400; double E2=0.1; double new_h,sum,norm_diff; double *f, *f_new, *u, *he, *Erfh, *ve, *Erfv, *de, *Erfd, *dre, *Erfdr, *u_val, *f_new_val, *temp, *Z_new_opt; long stop_criterion; double *sigma, *x, *y, *f_val, *error_Z,*diff; long r,step,k,i,j; double grad_cf_h, grad_lf_h, cf, lf, normf, normB, norm_grad_lf, tempv; double *grad_cf, *grad_lf, *grad_cf_he, *grad_cf_ve, *grad_cf_de, *grad_cf_dre; double *grad_lf_he, *grad_lf_ve, *grad_lf_de, *grad_lf_dre; double curve[1001],combined_norm; /*[N,M]=size(Z);*/ /*k01=length(rho1);*/ /*k02=length(rho2);*/ /*k03=length(rho3);*/ /*k04=length(rho4);*/ /*f=zeros(N,M);*/ f=(double *) malloc(N*M*sizeof(double)); zero_filling(f,N*M); f_new_val=(double *) malloc(N*M*sizeof(double)); zero_filling(f_new_val,N*M); u=(double *) malloc(N*M*sizeof(double)); zero_filling(u,N*M); u_val=(double *) malloc(N*M*sizeof(double)); zero_filling(u_val,N*M); temp=(double *) malloc(N*M*sizeof(double)); zero_filling(temp,N*M); Z_new_opt=(double *) malloc(N*M*sizeof(double)); zero_filling(Z_new_opt,N*M); diff=(double *) malloc(N*M*sizeof(double)); zero_filling(diff,N*M); /*f_new=zeros(N,M);*/ f_new=(double *)malloc(N*M*sizeof(double)); zero_filling(f_new,N*M); /*h(1)=sum(sum(Z))/N/M;*/ *h=mean_value2D(Z,N,M); if (k01!=0){ /*he=zeros(k01,1);*/ he=(double *)malloc(k01*sizeof(double)); zero_filling(he,k01); /*Erfh=zeros(k01,N,M);*/ Erfh=(double *)malloc(k01*N*M*sizeof(double)); zero_filling(Erfh,k01*N*M); grad_lf_he=(double *)malloc(k01*sizeof(double)); zero_filling(grad_lf_he,k01); grad_cf_he=(double *)malloc(k01*sizeof(double)); zero_filling(grad_cf_he,k01); } else{ /*he=[];*/ he=NULL; /*Erfh=[];*/ Erfh=NULL; grad_lf_he=NULL; grad_cf_he=NULL; } if (k02!=0){ /*ve=zeros(k02,1);*/ ve=(double *)malloc(k02*sizeof(double)); zero_filling(ve,k02); /*Erfv=zeros(k02,N,M);*/ Erfv=(double *)malloc(k02*N*M*sizeof(double)); zero_filling(Erfv,k02*N*M); grad_lf_ve=(double *)malloc(k02*sizeof(double)); zero_filling(grad_lf_ve,k02); grad_cf_ve=(double *)malloc(k02*sizeof(double)); zero_filling(grad_cf_ve,k02); } else{ /*ve=[];*/ ve=NULL; /*Erfv=[];*/ Erfv=NULL; grad_lf_ve=NULL; grad_cf_ve=NULL; } if (k03!=0){ /*de=zeros(k03,1);*/ de=(double *)malloc(k03*sizeof(double)); zero_filling(de,k03); /*Erfd=zeros(k03,N,M);*/ Erfd=(double *)malloc(k03*N*M*sizeof(double)); zero_filling(Erfd,k03*N*M); grad_lf_de=(double *)malloc(k03*sizeof(double)); zero_filling(grad_lf_de,k03); grad_cf_de=(double *)malloc(k03*sizeof(double)); zero_filling(grad_cf_de,k03); } else{ /*de=[];*/ de=NULL; /*Erfd=[];*/ Erfd=NULL; grad_lf_de=NULL; grad_cf_de=NULL; } if (k04!=0){ /*dre=zeros(k04,1);*/ dre=(double *)malloc(k04*sizeof(double)); zero_filling(dre,k04); /*Erfdr=zeros(k04,N,M);*/ Erfdr=(double *)malloc(k04*N*M*sizeof(double)); zero_filling(Erfdr,k04*N*M); grad_lf_dre=(double *)malloc(k04*sizeof(double)); zero_filling(grad_lf_dre,k04); grad_cf_dre=(double *)malloc(k04*sizeof(double)); zero_filling(grad_cf_dre,k04); } else{ /*dre=[];*/ dre=NULL; /*Erfdr=[];*/ Erfdr=NULL; grad_lf_dre=NULL; grad_cf_dre=NULL; } stop_criterion=0; sigma=(double *)malloc(1001*sizeof(double)); zero_filling(sigma,1001); for (r=1;r<=10;r++){ sigma[r-1]=11-r; } for (r=11;r<=1001;r++){ sigma[r-1]=10/((double)r); } /*x=0:1/(M-1):1;*/ x=(double *)malloc(N*sizeof(double)); for (i=0;i1){ if ( curve[step]==0 ) stop_criterion=1; else if ( (fabs(curve[step]-curve[step-1])/curve[step]1){ if ( curve[step]==0 ) stop_criterion=1; else if ( (fabs(curve[step]-curve[step-1])/curve[step]1){ if ( curve[step]==0 ) stop_criterion=1; else if ( (fabs(curve[step]-curve[step-1])/curve[step]=threshold) psi_used[i]=1; else psi_used[i]=0; } mu=2*mu; how_many_steps=proj_optim_l1_l2_norm_semi_parametric(f_opt, Z_opt, h, b_psi, psi, gamma, psi_used, Z, Kappa, N, N_psi, lambda, b0, b1, epsilon0, mu, mu2, E1, E2); } free(sorted_b_psi); } long proj_optim_l1_l2_norm_semi_parametric(/*outputs*/double *f_opt,double *Z_opt, double *h, double *b_psi, /*inputs*/long *psi, double *gamma, short *psi_used, double *Z, double *Kappa, long N, long N_psi, double lambda,double b0, double b1, double epsilon0, double mu, double mu2,double E1, double E2) { double *new_h,sum,norm_diff; double *f, *f_new, *u, *he, *u_val, *f_new_val, *temp, *Z_new_opt; long stop_criterion; double *sigma, *sigma2,*x, *y, *f_val, *error_Z,*diff; long r,step,k,i,j; double *grad_c_h, *grad_l_h, *grad_c_b, *grad_l_b, cf, lf, normf, normB, normH, norm_grad_l_f, tempv; double *grad_c_f, *grad_l_f; double curve[10001],combined_norm; double *new_b_psi,L_function0, L_function1,norm_grad_l_b; long total_psi_used; total_psi_used=0; for(i=0;i1){ if ( curve[step]==0 ) stop_criterion=1; else if ( (fabs(curve[step])=0)&&(Z_opt[i]<=255)) i=i; else i=i; } free(f); free(f_new_val); free(u); free(u_val); free(temp); free(Z_new_opt); free(diff); free(f_new); free(new_b_psi); free(grad_l_b); free(grad_c_b); free(sigma); free(sigma2); free(x); free(y); free(f_val); free(grad_c_f); free(grad_l_f); free(error_Z); return step; } long proj_optim_l1_l2_norm_semi_parametric2(/*outputs*/double *f_opt,double *Z_opt, double *h, double *b_psi, /*inputs*/long *psi, double *gamma, short *psi_used, double *Z, double *Kappa, long N, long N_psi, double lambda,double b0, double b1, double epsilon0, double mu, double mu2,double E1, double E2) { double *new_h,sum,norm_diff; double *f, *f_new, *u, *he, *u_val, *f_new_val, *temp, *Z_new_opt; long stop_criterion; double *sigma, *sigma2,*x, *y, *f_val, *error_Z,*diff; long r,step,k,i,j; double *grad_c_h, *grad_l_h, *grad_c_b, *grad_l_b, cf, lf, normf, normB, normH, norm_grad_l_f, tempv; double *grad_c_f, *grad_l_f; double curve[10001],combined_norm; double *new_b_psi,L_function0, L_function1,norm_grad_l_b; long total_psi_used; total_psi_used=0; for(i=0;i1){ if ( curve[step]==0 ) stop_criterion=1; else if ( (fabs(curve[step])=0)&&(Z_opt[i]<=255)) i=i; else i=i; } free(f); free(f_new_val); free(u); free(u_val); free(temp); free(Z_new_opt); free(diff); free(f_new); free(new_b_psi); free(grad_l_b); free(grad_c_b); free(sigma); free(sigma2); free(x); free(y); free(f_val); free(grad_c_f); free(grad_l_f); free(error_Z); return step; } long proj_optim_l1_l1_norm_semi_parametric(/*outputs*/double *f_opt,double *Z_opt, double *h, double *b_psi, /*inputs*/long *psi, double *gamma, short *psi_used, double *Z, double *Kappa, long N, long N_psi, double lambda,double b0, double b1, double epsilon0, double mu, double mu2,double E1, double E2) { double *new_h,sum,norm_diff; double *f, *f_new, *u, *he, *u_val, *f_new_val, *temp, *Z_new_opt; long stop_criterion; double *sigma, *sigma2,*x, *y, *f_val, *error_Z,*diff; long r,step,k,i,j; double *grad_c_h, *grad_l_h, *grad_c_b, *grad_l_b, cf, lf, normf, normB, normH, norm_grad_l_f, tempv; double *grad_c_f, *grad_l_f; double curve[10001],combined_norm; double *new_b_psi,L_function0, L_function1,norm_grad_l_b; long total_psi_used; total_psi_used=0; for(i=0;i1){ if ( curve[step]==0 ) stop_criterion=1; else if ( (fabs(curve[step])=0)&&(Z_opt[i]<=255)) i=i; else i=i; } free(f); free(f_new_val); free(u); free(u_val); free(temp); free(Z_new_opt); free(diff); free(f_new); free(new_b_psi); free(grad_l_b); free(grad_c_b); free(sigma); free(sigma2); free(x); free(y); free(f_val); free(grad_c_f); free(grad_l_f); free(error_Z); return step; } void Kernel_Denoising(double *return_pic, double *ori_pic, long M0, long N0, long n, long steps, double lambda_min, double lambda_max, double sigma_min, double sigma_max,double b0, double b1, double epsilon0, double initial_mu, double *mu_vector, long LEN_mu, double *per_vector, long *n_vector, long *method_vector, long *iter_pixel_step){ long maxn,step,metritis; long pixel_step,m,M,N,i,j,i0,j0,i1,j1,k,l; double *new_pic,sigma,lambda,mu; long *index_pic; double *Kappa1; unsigned long *Kappa; double *x,*y; double percentage,percent,grad; long print=0,k0,l0; double *pic; /*double slope=4; double rho1[3]={-1, 0, 1}, l1=3; long k01=3; double rho2[3]={-1, 0, 1}, l2=3; long k02=3; double rho3[3]={-1, 0, 1}, l3=3; long k03=3; double rho4[3]={-1, 0, 1}, l4=3; long k04=3;*/ double slope=8; double rho1[7]={-3, -2, -1, 0, 1, 2, 3}, l1=7; long k01=7; double rho2[7]={-3, -2, -1, 0, 1, 2, 3}, l2=7; long k02=7; double rho3[5]={-2, -1, 0, 1, 2}, l3=5; long k03=5; double rho4[5]={-2, -1, 0, 1, 2 }, l4=5; long k04=5; double *region; double *new_region; double *med_grad; double *temp_array; double *thres=(double*)malloc(LEN_mu*sizeof(double)); double *metr=(double*)malloc(LEN_mu*sizeof(double)); double *f_opt,max_grad,min_grad; long how_many_steps,method,k1; long (*compare)(const double*,const double*); double h2; double *h=(double*)malloc(k01*sizeof(double)); double *he=(double*)malloc(k01*sizeof(double)); double *ve=(double*)malloc(k02*sizeof(double)); double *de=(double*)malloc(k03*sizeof(double)); double *dre=(double*)malloc(k04*sizeof(double)); double mu2; //double mu_vector2[6]= {0.0001, 0.001, 0.01, 0.5, 1.0, 3.0}; //double per_vector2[6]={0.100, 0.10, 0.10, 0.2, 0.1, 0.4}; m=n; maxn=find_max_long(n_vector,LEN_mu); pixel_step=iter_pixel_step[0]; /*Initial step*/ M=M0+maxn-1; N=N0+maxn-1; med_grad=(double*)malloc(M0*N0*sizeof(double)); zero_filling(med_grad,N0*M0); /*pic=image_extend(ori_pic,maxn-1,maxn-1);*/ pic=malloc(N*M*sizeof(double)); image_extend(pic,ori_pic,M0,N0,maxn-1,maxn-1); /*new_pic=zeros(M,N);*/ new_pic=(double*) malloc(M*N*sizeof(double)); zero_filling(new_pic,M*N); /*index_pic=zeros(M,N);*/ index_pic=(long*)malloc(M*N*sizeof(long)); zero_filling_long(index_pic,M*N); temp_array=(double*)malloc(M0*N0*sizeof(double)); zero_filling(temp_array,M0*N0); /*Initial phase. Construct Kappa - matrix.*/ x=(double *)malloc(n*sizeof(double)); /*x=0:1/(n-1):1;*/ for(i=0;i=1 ) ){ if (print==0){ if ( (long)floor(percentage*100)<10 ) printf("\b\b\b"); else printf("\b\b\b\b"); } } else if (print==0){ printf("Step 0. Completed: ",(long)floor(percentage*100)); } if (print==0){ printf("%d %%",(long)floor(percentage*100)); print=1; } } else print=0; } } for(i=1;i<=M0;i++) for(j=1;j<=N0;j++) return_pic[(i-1)*N0+j-1]=new_pic[(i+maxn/2-1)*N+j+maxn/2-1]/index_pic[(i+maxn/2-1)*N+j+maxn/2-1]; free(Kappa1); /*for(k=0;k=1 ) ){ if (print==0){ if ( (long)floor(percentage*100)<10 ) printf("\b\b\b"); else printf("\b\b\b\b"); } } else if (print==0){ printf("Step %d. Completed: ",step,(long)floor(percentage*100)); } if (print==0){ printf("%d %%",(long)floor(percentage*100)); print=1; } } else print=0; } } for(i=1;i<=M0;i++) for(j=1;j<=N0;j++) return_pic[(i-1)*N0+j-1]=new_pic[(i+maxn/2-1)*N+j+maxn/2-1]/index_pic[(i+maxn/2-1)*N+j+maxn/2-1]; } for(i=0;ib1) return_pic[i]=b1; else if (return_pic[i]=0)&&(i_n=0)&&(j_n=0)&&(i_n=0)&&(j_n=0)&&(i_n=0)&&(j_n=0)&&(i_n=0)&&(j_n=0)&&(i_n=0)&&(j_n=0)&&(i_n=0)&&(j_n=0)&&(i_n=0)&&(j_n=0)&&(i_n=0)&&(j_n=2) k+=1; else{ if (temp_counter2>=1) k+=2; else k+=3; } } else stop=1; if (k>k_max) k=k_max; edge_value[i*N0+j]=k; } } } n2=(n+1)/2; for (i=0+n2+n2/2;iE){ fix=1; break; } } if (fix==1) break; } E=(b1-b0)/15; for (l=1;l<=8;l++){ if (fabs(mean[l]-center_mean)k_max) edge_value[i*N0+j]=k_max; } } } void Kernel_Denoising_semi_parametric(/*output*/double *return_pic, /*inputs*/double *ori_pic, long M0, long N0, long n, long steps, double lambda, double sigma,double b0, double b1, double epsilon0, double initial_mu, double *mu_vector, double *mu2_vector, double *calc_type, long LEN_mu, double *per_vector, long *n_vector, long *method_vector, long *iter_pixel_step, long *psi_vector, long *N_psi_vector, long *gamma_vector){ double E1,E2; long maxn,step,metritis; long pixel_step,m,M,N,i,j,i0,j0,i1,j1,k,l,min; double *new_pic,mu; long *index_pic,ii; double *Kappa1; unsigned long *Kappa; double *x,*y; double percentage,percent,grad,temp_sum; long print=0,k0,l0; double *pic; double *region,*noisy_region; double *new_region; double *med_grad,*edge_value; double *temp_array; double *thres=(double*)malloc(LEN_mu*sizeof(double)); double *metr=(double*)malloc(LEN_mu*sizeof(double)); double *f_opt,max_grad,min_grad,temp_step; long how_many_steps,method,k1, i_n, j_n, temp_counter1,temp_counter2,stop, k_n; long (*compare)(const double*,const double*); double h2; double *h=(double*)malloc(4*sizeof(double)); double mu2; int v; long* psi; double* gamma; long N_psi; short* psi_used; double* b_psi; m=n; maxn=find_max_long(n_vector,LEN_mu); pixel_step=iter_pixel_step[0]; /*Initial step*/ M=M0+maxn-1; N=N0+maxn-1; med_grad=(double*)malloc(M0*N0*sizeof(double)); zero_filling(med_grad,N0*M0); edge_value=(double*)malloc(M0*N0*sizeof(double)); zero_filling(edge_value,N0*M0); /*pic=image_extend(ori_pic,maxn-1,maxn-1);*/ pic=malloc(N*M*sizeof(double)); image_extend(pic,ori_pic,M0,N0,maxn-1,maxn-1); /*new_pic=zeros(M,N);*/ new_pic=(double*) malloc(M*N*sizeof(double)); zero_filling(new_pic,M*N); /*index_pic=zeros(M,N);*/ index_pic=(long*)malloc(M*N*sizeof(long)); zero_filling_long(index_pic,M*N); temp_array=(double*)malloc(M0*N0*sizeof(double)); zero_filling(temp_array,M0*N0); /*Initial phase. Construct Kappa - matrix.*/ x=(double *)malloc(n*sizeof(double)); /*x=0:1/(n-1):1;*/ for(i=0;i=1 ) ){ if (print==0){ if ( (long)floor(percentage*100)<10 ) printf("\b\b\b"); else printf("\b\b\b\b"); } } else if (print==0){ printf("Step 0. Completed: ",(long)floor(percentage*100)); } if (print==0){ printf("%d %%",(long)floor(percentage*100)); print=1; } } else print=0; } } for(i=1;i<=M0;i++) for(j=1;j<=N0;j++){ if (index_pic[(i+maxn/2-1)*N+j+maxn/2-1]!=0){ return_pic[(i-1)*N0+j-1]=new_pic[(i+maxn/2-1)*N+j+maxn/2-1]/index_pic[(i+maxn/2-1)*N+j+maxn/2-1]; } else return_pic[(i-1)*N0+j-1]=0; } free(Kappa1); /*for(k=0;k=2) ){ E1=0.1; E2=0.5; } else{ E1=0.5; E2=0.8; } how_many_steps=proj_optim_l1_l2_norm_semi_parametric(f_opt,new_region, h, b_psi, psi, gamma, psi_used, region, (double*)Kappa[k-1], n, N_psi, lambda, b0, b1, epsilon0, mu, mu2,E1,E2); //how_many_steps=progressive_proj_optim_l1_l2_norm_semi_parametric(f_opt,new_region, h, b_psi, psi, gamma, psi_used, region, (double*)Kappa[k-1], n, N_psi, lambda, b0, b1, epsilon0, mu, mu2,E1,E2,10); free(psi_used); free(b_psi); } if (! ((pixel_step>1)||(calc_type[k-1]==1)) ){ new_pic[(i-1)*N+j-1]=new_region[(n/2)*n +n/2]; index_pic[(i-1)*N+(j-1)]=-1; } else{ k0=0; for (k1=i-(m-1)/2;k1<=i+(m-1)/2;k1++){ k0++; l0=0; for (l=j-(n-1)/2;l<=j+(n-1)/2;l++){ l0++; if (index_pic[(k1-1)*N+l-1]!=-1){ new_pic[(k1-1)*N+l-1]=new_pic[(k1-1)*N+l-1]+new_region[(k0-1)*n+l0-1]; index_pic[(k1-1)*N+l-1]=index_pic[(k1-1)*N+l-1]+1; } } } } percentage=percentage+1.0/N0/M0*pixel_step * pixel_step; if ((long)floor(percentage*1000)%10==0){ if ( ( (long)floor(percentage*100)>=1 ) ){ if (print==0){ if ( (long)floor(percentage*100)<10 ) printf("\b\b\b"); else printf("\b\b\b\b"); } } else if (print==0){ printf("Step %d. Completed: ",step,(long)floor(percentage*100)); } if (print==0){ printf("%d %%",(long)floor(percentage*100)); print=1; } } else print=0; } } for(i=1;i<=M0;i++) for(j=1;j<=N0;j++){ if (index_pic[(i+maxn/2-1)*N+j+maxn/2-1]!=0){ if (index_pic[(i+maxn/2-1)*N+j+maxn/2-1]==-1) return_pic[(i-1)*N0+j-1]=new_pic[(i+maxn/2-1)*N+j+maxn/2-1]; else return_pic[(i-1)*N0+j-1]=new_pic[(i+maxn/2-1)*N+j+maxn/2-1]/index_pic[(i+maxn/2-1)*N+j+maxn/2-1]; } else return_pic[(i-1)*N0+j-1]=0; if ((return_pic[(i-1)*N0+j-1]>=0)&&(return_pic[(i-1)*N0+j-1]<=255)) i=i; else j=j; } } for(i=0;ib1) return_pic[i]=b1; else if (return_pic[i]