#include "Median_Filter.h" #include "StdAfx.h" #include <algorithm> using namespace std; unsigned char median(unsigned char input [], unsigned char l) { //l size of input (# elements) sort(input, input + l); //built-in sort algorithm if (l%2) return input[1/2]; //pure median else return (unsigned char)( ( (float)input[1/2]+(float)input[1/2+1] ) /2 + 0.5 ); //+0.5 -> round to closest int } unsigned char median_w_averaging(unsigned char input [], unsigned char l, unsigned char n_med) { //n # points around the median used for averaging //l size of input (# elements) sort(input, input + l); //built-in sort algorithm register unsigned short int sum = 0; for (register unsigned short int i=0; i<n_med; i++) sum = sum + input[(1-n_med/2)/2 + i]; return (unsigned char)( (double)sum/(double)n_med + 0.5 ); //+0.5 -> round to closest int } void ds_median_first_slice(DS_cube* ds_input, DS_slice* buffer_slice) { //1st slice unsigned char n_med=0; //n # points around the median used for averaging register unsigned short int i,j,k; k=0; //bulk (1) - (values[18]) { n_med = 6; const unsigned char input_size=18; for (i=1; i<ds_input->wX-1; i++) for (j=1; j<ds_input->wY-1; j++) { register char l,m,n; register unsigned char ind_val = 0; unsigned char values[input_size]; for (l=-1; l<=1; l++) for (m=-1; m<=1; m++) for (n=0; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median(values, input_size); } } //sides (4) - (values[12]) { n_med = 4; const unsigned char input_size=12; for (j=1; j<ds_input->wY-1; j++) { i=0; register char l,m,n; register unsigned char ind_val = 0; unsigned char values[input_size]; for (l=0; l<=1; l++) for (m=-1; m<=1; m++) for (n=0; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median(values, input_size); i=ds_input->wX-1; ind_val = 0; for (l=-1; l<=0; l++) for (m=-1; m<=1; m++) for (n=0; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median(values, input_size); } for (i=1; i<ds_input->wX-1; i++) { j=0; register char l,m,n; register unsigned char ind_val = 0; unsigned char values[input_size]; for (l=-1; l<=1; l++) for (m=0; m<=1; m++) for (n=0; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median(values, input_size); j=ds_input->wY-1; ind_val = 0; for (l=-1; l<=1; l++) for (m=-1; m<=0; m++) for (n=0; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median(values, input_size); } } //corners (4) - (values[8]) { n_med = 2; const unsigned char input_size=8; register char l,m,n; unsigned char values[input_size]; register unsigned char ind_val; i=0; j=0; ind_val = 0; for (l=0; l<=1; l++) for (m=0; m<=1; m++) for (n=0; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median(values, input_size); j=ds_input->wY-1; ind_val = 0; for (l=0; l<=1; l++) for (m=-1; m<=0; m++) for (n=0; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median(values, input_size); i=ds_input->wX-1; ind_val = 0; for (l=-1; l<=0; l++) for (m=-1; m<=0; m++) for (n=0; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median(values, input_size); j=0; ind_val = 0; for (l=-1; l<=0; l++) for (m=0; m<=1; m++) for (n=0; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median(values, input_size); } } void ds_median_mid_slice(DS_cube* ds_input, DS_slice* buffer_slice, register unsigned short int k) { unsigned char n_med=0; //n # points around the median used for averaging register unsigned short int i,j; //bulk (1) - (values[27]) { n_med = 9; const unsigned char input_size=27; for (i=1; i<ds_input->wX-1; i++) for (j=1; j<ds_input->wY-1; j++) { register char l,m,n; register unsigned char ind_val = 0; unsigned char values[input_size]; for (l=-1; l<=1; l++) for (m=-1; m<=1; m++) for (n=-1; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median(values, input_size); } } //sides (4) - (values[18]) { n_med = 6; const unsigned char input_size=18; for (j=1; j<ds_input->wY-1; j++) { i=0; register char l,m,n; register unsigned char ind_val = 0; unsigned char values[input_size]; for (l=0; l<=1; l++) for (m=-1; m<=1; m++) for (n=-1; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median(values, input_size); i=ds_input->wX-1; ind_val = 0; for (l=-1; l<=0; l++) for (m=-1; m<=1; m++) for (n=-1; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median(values, input_size); } for (i=1; i<ds_input->wX-1; i++) { j=0; register char l,m,n; register unsigned char ind_val = 0; unsigned char values[input_size]; for (l=-1; l<=1; l++) for (m=0; m<=1; m++) for (n=-1; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median(values, input_size); j=ds_input->wY-1; ind_val = 0; for (l=-1; l<=1; l++) for (m=-1; m<=0; m++) for (n=-1; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median(values, input_size); } } //corners (4) - (values[12]) { n_med = 4; const unsigned char input_size=12; register char l,m,n; unsigned char values[input_size]; register unsigned char ind_val; i=0; j=0; ind_val = 0; for (l=0; l<=1; l++) for (m=0; m<=1; m++) for (n=-1; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median(values, input_size); j=ds_input->wY-1; ind_val = 0; for (l=0; l<=1; l++) for (m=-1; m<=0; m++) for (n=-1; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median(values, input_size); i=ds_input->wX-1; ind_val = 0; for (l=-1; l<=0; l++) for (m=-1; m<=0; m++) for (n=-1; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median(values, input_size); j=0; ind_val = 0; for (l=-1; l<=0; l++) for (m=0; m<=1; m++) for (n=-1; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median(values, input_size); } } void ds_median_last_slice(DS_cube* ds_input, DS_slice* buffer_slice) { //last slice unsigned char n_med=0; //n # points around the median used for averaging register unsigned short int i,j,k; k=ds_input->wZ-1; //bulk (1) - (values[18]) { n_med = 6; const unsigned char input_size=18; for (i=1; i<ds_input->wX-1; i++) for (j=1; j<ds_input->wY-1; j++) { register char l,m,n; register unsigned char ind_val = 0; unsigned char values[input_size]; for (l=-1; l<=1; l++) for (m=-1; m<=1; m++) for (n=-1; n<=0; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median(values, input_size); } } //sides (4) - (values[12]) { n_med = 4; const unsigned char input_size=12; for (j=1; j<ds_input->wY-1; j++) { i=0; register char l,m,n; register unsigned char ind_val = 0; unsigned char values[input_size]; for (l=0; l<=1; l++) for (m=-1; m<=1; m++) for (n=-1; n<=0; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median(values, input_size); i=ds_input->wX-1; ind_val = 0; for (l=-1; l<=0; l++) for (m=-1; m<=1; m++) for (n=-1; n<=0; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median(values, input_size); } for (i=1; i<ds_input->wX-1; i++) { j=0; register char l,m,n; register unsigned char ind_val = 0; unsigned char values[input_size]; for (l=-1; l<=1; l++) for (m=0; m<=1; m++) for (n=-1; n<=0; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median(values, input_size); j=ds_input->wY-1; ind_val = 0; for (l=-1; l<=1; l++) for (m=-1; m<=0; m++) for (n=-1; n<=0; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median(values, input_size); } } //corners (4) - (values[8]) { n_med = 2; const unsigned char input_size=8; register char l,m,n; unsigned char values[input_size]; register unsigned char ind_val; i=0; j=0; ind_val = 0; for (l=0; l<=1; l++) for (m=0; m<=1; m++) for (n=-1; n<=0; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median(values, input_size); j=ds_input->wY-1; ind_val = 0; for (l=0; l<=1; l++) for (m=-1; m<=0; m++) for (n=-1; n<=0; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median(values, input_size); i=ds_input->wX-1; ind_val = 0; for (l=-1; l<=0; l++) for (m=-1; m<=0; m++) for (n=-1; n<=0; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median(values, input_size); j=0; ind_val = 0; for (l=-1; l<=0; l++) for (m=0; m<=1; m++) for (n=-1; n<=0; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median(values, input_size); } } void ds_median_w_averaging_first_slice(DS_cube* ds_input, DS_slice* buffer_slice) { //1st slice unsigned char n_med=0; //n # points around the median used for averaging register unsigned short int i,j,k; k=0; //bulk (1) - (values[18]) { n_med = 6; const unsigned char input_size=18; for (i=1; i<ds_input->wX-1; i++) for (j=1; j<ds_input->wY-1; j++) { register char l,m,n; register unsigned char ind_val = 0; unsigned char values[input_size]; for (l=-1; l<=1; l++) for (m=-1; m<=1; m++) for (n=0; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median_w_averaging(values, input_size, n_med); } } //sides (4) - (values[12]) { n_med = 4; const unsigned char input_size=12; for (j=1; j<ds_input->wY-1; j++) { i=0; register char l,m,n; register unsigned char ind_val = 0; unsigned char values[input_size]; for (l=0; l<=1; l++) for (m=-1; m<=1; m++) for (n=0; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median_w_averaging(values, input_size, n_med); i=ds_input->wX-1; ind_val = 0; for (l=-1; l<=0; l++) for (m=-1; m<=1; m++) for (n=0; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median_w_averaging(values, input_size, n_med); } for (i=1; i<ds_input->wX-1; i++) { j=0; register char l,m,n; register unsigned char ind_val = 0; unsigned char values[input_size]; for (l=-1; l<=1; l++) for (m=0; m<=1; m++) for (n=0; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median_w_averaging(values, input_size, n_med); j=ds_input->wY-1; ind_val = 0; for (l=-1; l<=1; l++) for (m=-1; m<=0; m++) for (n=0; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median_w_averaging(values, input_size, n_med); } } //corners (4) - (values[8]) { n_med = 2; const unsigned char input_size=8; register char l,m,n; unsigned char values[input_size]; register unsigned char ind_val; i=0; j=0; ind_val = 0; for (l=0; l<=1; l++) for (m=0; m<=1; m++) for (n=0; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median_w_averaging(values, input_size, n_med); j=ds_input->wY-1; ind_val = 0; for (l=0; l<=1; l++) for (m=-1; m<=0; m++) for (n=0; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median_w_averaging(values, input_size, n_med); i=ds_input->wX-1; ind_val = 0; for (l=-1; l<=0; l++) for (m=-1; m<=0; m++) for (n=0; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median_w_averaging(values, input_size, n_med); j=0; ind_val = 0; for (l=-1; l<=0; l++) for (m=0; m<=1; m++) for (n=0; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median_w_averaging(values, input_size, n_med); } } void ds_median_w_averaging_w_averaging_mid_slice(DS_cube* ds_input, DS_slice* buffer_slice, register unsigned short int k) { unsigned char n_med=0; //n # points around the median_w_averaging used for averaging register unsigned short int i,j; //bulk (1) - (values[27]) { n_med = 9; const unsigned char input_size=27; for (i=1; i<ds_input->wX-1; i++) for (j=1; j<ds_input->wY-1; j++) { register char l,m,n; register unsigned char ind_val = 0; unsigned char values[input_size]; for (l=-1; l<=1; l++) for (m=-1; m<=1; m++) for (n=-1; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median_w_averaging(values, input_size, n_med); } } //sides (4) - (values[18]) { n_med = 6; const unsigned char input_size=18; for (j=1; j<ds_input->wY-1; j++) { i=0; register char l,m,n; register unsigned char ind_val = 0; unsigned char values[input_size]; for (l=0; l<=1; l++) for (m=-1; m<=1; m++) for (n=-1; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median_w_averaging(values, input_size, n_med); i=ds_input->wX-1; ind_val = 0; for (l=-1; l<=0; l++) for (m=-1; m<=1; m++) for (n=-1; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median_w_averaging(values, input_size, n_med); } for (i=1; i<ds_input->wX-1; i++) { j=0; register char l,m,n; register unsigned char ind_val = 0; unsigned char values[input_size]; for (l=-1; l<=1; l++) for (m=0; m<=1; m++) for (n=-1; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median_w_averaging(values, input_size, n_med); j=ds_input->wY-1; ind_val = 0; for (l=-1; l<=1; l++) for (m=-1; m<=0; m++) for (n=-1; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median_w_averaging(values, input_size, n_med); } } //corners (4) - (values[12]) { n_med = 4; const unsigned char input_size=12; register char l,m,n; unsigned char values[input_size]; register unsigned char ind_val; i=0; j=0; ind_val = 0; for (l=0; l<=1; l++) for (m=0; m<=1; m++) for (n=-1; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median_w_averaging(values, input_size, n_med); j=ds_input->wY-1; ind_val = 0; for (l=0; l<=1; l++) for (m=-1; m<=0; m++) for (n=-1; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median_w_averaging(values, input_size, n_med); i=ds_input->wX-1; ind_val = 0; for (l=-1; l<=0; l++) for (m=-1; m<=0; m++) for (n=-1; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median_w_averaging(values, input_size, n_med); j=0; ind_val = 0; for (l=-1; l<=0; l++) for (m=0; m<=1; m++) for (n=-1; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median_w_averaging(values, input_size, n_med); } } void ds_median_w_averaging_w_averaging_last_slice(DS_cube* ds_input, DS_slice* buffer_slice) { //last slice unsigned char n_med=0; //n # points around the median_w_averaging used for averaging register unsigned short int i,j,k; k=ds_input->wZ-1; //bulk (1) - (values[18]) { n_med = 6; const unsigned char input_size=18; for (i=1; i<ds_input->wX-1; i++) for (j=1; j<ds_input->wY-1; j++) { register char l,m,n; register unsigned char ind_val = 0; unsigned char values[input_size]; for (l=-1; l<=1; l++) for (m=-1; m<=1; m++) for (n=-1; n<=0; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median_w_averaging(values, input_size, n_med); } } //sides (4) - (values[12]) { n_med = 4; const unsigned char input_size=12; for (j=1; j<ds_input->wY-1; j++) { i=0; register char l,m,n; register unsigned char ind_val = 0; unsigned char values[input_size]; for (l=0; l<=1; l++) for (m=-1; m<=1; m++) for (n=-1; n<=0; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median_w_averaging(values, input_size, n_med); i=ds_input->wX-1; ind_val = 0; for (l=-1; l<=0; l++) for (m=-1; m<=1; m++) for (n=-1; n<=0; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median_w_averaging(values, input_size, n_med); } for (i=1; i<ds_input->wX-1; i++) { j=0; register char l,m,n; register unsigned char ind_val = 0; unsigned char values[input_size]; for (l=-1; l<=1; l++) for (m=0; m<=1; m++) for (n=-1; n<=0; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median_w_averaging(values, input_size, n_med); j=ds_input->wY-1; ind_val = 0; for (l=-1; l<=1; l++) for (m=-1; m<=0; m++) for (n=-1; n<=0; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median_w_averaging(values, input_size, n_med); } } //corners (4) - (values[8]) { n_med = 2; const unsigned char input_size=8; register char l,m,n; unsigned char values[input_size]; register unsigned char ind_val; i=0; j=0; ind_val = 0; for (l=0; l<=1; l++) for (m=0; m<=1; m++) for (n=-1; n<=0; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median_w_averaging(values, input_size, n_med); j=ds_input->wY-1; ind_val = 0; for (l=0; l<=1; l++) for (m=-1; m<=0; m++) for (n=-1; n<=0; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median_w_averaging(values, input_size, n_med); i=ds_input->wX-1; ind_val = 0; for (l=-1; l<=0; l++) for (m=-1; m<=0; m++) for (n=-1; n<=0; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median_w_averaging(values, input_size, n_med); j=0; ind_val = 0; for (l=-1; l<=0; l++) for (m=0; m<=1; m++) for (n=-1; n<=0; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; buffer_slice->data[j][i] = median_w_averaging(values, input_size, n_med); } } void ds_median_first_slice_cube(DS_cube* ds_input, DS_cube* ds_output) { //1st slice unsigned char n_med=0; //n # points around the median used for averaging register unsigned short int i,j,k; k=0; //bulk (1) - (values[18]) { n_med = 6; const unsigned char input_size=18; for (i=1; i<ds_input->wX-1; i++) for (j=1; j<ds_input->wY-1; j++) { register char l,m,n; register unsigned char ind_val = 0; unsigned char values[input_size]; for (l=-1; l<=1; l++) for (m=-1; m<=1; m++) for (n=0; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; ds_output->data[0][j][i] = median(values, input_size); } } //sides (4) - (values[12]) { n_med = 4; const unsigned char input_size=12; for (j=1; j<ds_input->wY-1; j++) { i=0; register char l,m,n; register unsigned char ind_val = 0; unsigned char values[input_size]; for (l=0; l<=1; l++) for (m=-1; m<=1; m++) for (n=0; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; ds_output->data[0][j][i] = median(values, input_size); i=ds_input->wX-1; ind_val = 0; for (l=-1; l<=0; l++) for (m=-1; m<=1; m++) for (n=0; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; ds_output->data[0][j][i] = median(values, input_size); } for (i=1; i<ds_input->wX-1; i++) { j=0; register char l,m,n; register unsigned char ind_val = 0; unsigned char values[input_size]; for (l=-1; l<=1; l++) for (m=0; m<=1; m++) for (n=0; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; ds_output->data[0][j][i] = median(values, input_size); j=ds_input->wY-1; ind_val = 0; for (l=-1; l<=1; l++) for (m=-1; m<=0; m++) for (n=0; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; ds_output->data[0][j][i] = median(values, input_size); } } //corners (4) - (values[8]) { n_med = 2; const unsigned char input_size=8; register char l,m,n; unsigned char values[input_size]; register unsigned char ind_val; i=0; j=0; ind_val = 0; for (l=0; l<=1; l++) for (m=0; m<=1; m++) for (n=0; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; ds_output->data[0][j][i] = median(values, input_size); j=ds_input->wY-1; ind_val = 0; for (l=0; l<=1; l++) for (m=-1; m<=0; m++) for (n=0; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; ds_output->data[0][j][i] = median(values, input_size); i=ds_input->wX-1; ind_val = 0; for (l=-1; l<=0; l++) for (m=-1; m<=0; m++) for (n=0; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; ds_output->data[0][j][i] = median(values, input_size); j=0; ind_val = 0; for (l=-1; l<=0; l++) for (m=0; m<=1; m++) for (n=0; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; ds_output->data[0][j][i] = median(values, input_size); } } void ds_median_mid_slice_cube(DS_cube* ds_input, DS_cube* ds_output, register unsigned short int depth_output, register unsigned short int k) { unsigned char n_med=0; //n # points around the median used for averaging register unsigned short int i,j; //bulk (1) - (values[27]) { n_med = 9; const unsigned char input_size=27; for (i=1; i<ds_input->wX-1; i++) for (j=1; j<ds_input->wY-1; j++) { register char l,m,n; register unsigned char ind_val = 0; unsigned char values[input_size]; for (l=-1; l<=1; l++) for (m=-1; m<=1; m++) for (n=-1; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; ds_output->data[depth_output][j][i] = median(values, input_size); } } //sides (4) - (values[18]) { n_med = 6; const unsigned char input_size=18; for (j=1; j<ds_input->wY-1; j++) { i=0; register char l,m,n; register unsigned char ind_val = 0; unsigned char values[input_size]; for (l=0; l<=1; l++) for (m=-1; m<=1; m++) for (n=-1; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; ds_output->data[depth_output][j][i] = median(values, input_size); i=ds_input->wX-1; ind_val = 0; for (l=-1; l<=0; l++) for (m=-1; m<=1; m++) for (n=-1; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; ds_output->data[depth_output][j][i] = median(values, input_size); } for (i=1; i<ds_input->wX-1; i++) { j=0; register char l,m,n; register unsigned char ind_val = 0; unsigned char values[input_size]; for (l=-1; l<=1; l++) for (m=0; m<=1; m++) for (n=-1; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; ds_output->data[depth_output][j][i] = median(values, input_size); j=ds_input->wY-1; ind_val = 0; for (l=-1; l<=1; l++) for (m=-1; m<=0; m++) for (n=-1; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; ds_output->data[depth_output][j][i] = median(values, input_size); } } //corners (4) - (values[12]) { n_med = 4; const unsigned char input_size=12; register char l,m,n; unsigned char values[input_size]; register unsigned char ind_val; i=0; j=0; ind_val = 0; for (l=0; l<=1; l++) for (m=0; m<=1; m++) for (n=-1; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; ds_output->data[depth_output][j][i] = median(values, input_size); j=ds_input->wY-1; ind_val = 0; for (l=0; l<=1; l++) for (m=-1; m<=0; m++) for (n=-1; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; ds_output->data[depth_output][j][i] = median(values, input_size); i=ds_input->wX-1; ind_val = 0; for (l=-1; l<=0; l++) for (m=-1; m<=0; m++) for (n=-1; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; ds_output->data[depth_output][j][i] = median(values, input_size); j=0; ind_val = 0; for (l=-1; l<=0; l++) for (m=0; m<=1; m++) for (n=-1; n<=1; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; ds_output->data[depth_output][j][i] = median(values, input_size); } } void ds_median_last_slice_cube(DS_cube* ds_input, DS_cube* ds_output, register unsigned short int depth_output) { //last slice unsigned char n_med=0; //n # points around the median used for averaging register unsigned short int i,j,k; k=ds_input->wZ-1; //bulk (1) - (values[18]) { n_med = 6; const unsigned char input_size=18; for (i=1; i<ds_input->wX-1; i++) for (j=1; j<ds_input->wY-1; j++) { register char l,m,n; register unsigned char ind_val = 0; unsigned char values[input_size]; for (l=-1; l<=1; l++) for (m=-1; m<=1; m++) for (n=-1; n<=0; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; ds_output->data[depth_output][j][i] = median(values, input_size); } } //sides (4) - (values[12]) { n_med = 4; const unsigned char input_size=12; for (j=1; j<ds_input->wY-1; j++) { i=0; register char l,m,n; register unsigned char ind_val = 0; unsigned char values[input_size]; for (l=0; l<=1; l++) for (m=-1; m<=1; m++) for (n=-1; n<=0; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; ds_output->data[depth_output][j][i] = median(values, input_size); i=ds_input->wX-1; ind_val = 0; for (l=-1; l<=0; l++) for (m=-1; m<=1; m++) for (n=-1; n<=0; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; ds_output->data[depth_output][j][i] = median(values, input_size); } for (i=1; i<ds_input->wX-1; i++) { j=0; register char l,m,n; register unsigned char ind_val = 0; unsigned char values[input_size]; for (l=-1; l<=1; l++) for (m=0; m<=1; m++) for (n=-1; n<=0; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; ds_output->data[depth_output][j][i] = median(values, input_size); j=ds_input->wY-1; ind_val = 0; for (l=-1; l<=1; l++) for (m=-1; m<=0; m++) for (n=-1; n<=0; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; ds_output->data[depth_output][j][i] = median(values, input_size); } } //corners (4) - (values[8]) { n_med = 2; const unsigned char input_size=8; register char l,m,n; unsigned char values[input_size]; register unsigned char ind_val; i=0; j=0; ind_val = 0; for (l=0; l<=1; l++) for (m=0; m<=1; m++) for (n=-1; n<=0; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; ds_output->data[depth_output][j][i] = median(values, input_size); j=ds_input->wY-1; ind_val = 0; for (l=0; l<=1; l++) for (m=-1; m<=0; m++) for (n=-1; n<=0; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; ds_output->data[depth_output][j][i] = median(values, input_size); i=ds_input->wX-1; ind_val = 0; for (l=-1; l<=0; l++) for (m=-1; m<=0; m++) for (n=-1; n<=0; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; ds_output->data[depth_output][j][i] = median(values, input_size); j=0; ind_val = 0; for (l=-1; l<=0; l++) for (m=0; m<=1; m++) for (n=-1; n<=0; n++) values[ind_val++] = ds_input->data[k+n][j+m][i+l]; ds_output->data[depth_output][j][i] = median(values, input_size); } } bool ds_median_w_center(DS_cube* ds_input, void* dlg_share) { //perform 3d median with max neighbours (27) if ((ds_input->wX <3) || (ds_input->wY <3) || (ds_input->wZ <3)) return false; //sample too small register unsigned short int k; //setup the progress bar parameters PoroMediaDialogShare* dlg = (PoroMediaDialogShare*) dlg_share; dlg->pbar_simulation_progress.SetRange(0, ds_input->wZ-1); dlg->pbar_simulation_progress.SetPos(0); dlg->pbar_simulation_progress.SetStep(1); //allocate temporary result slices DS_slice * buffer_slice = new DS_slice(ds_input->wY, ds_input->wX); if (!buffer_slice) { char log_txt[512]; sprintf(log_txt, "ds_median_full_low_mem: out of memory while allocating buffer_slice"); write_to_log(log_txt); return NULL; } DS_slice * buffer_slice2 = new DS_slice(ds_input->wY, ds_input->wX); if (!buffer_slice2) { char log_txt[512]; sprintf(log_txt, "ds_median_full_low_mem: out of memory while allocating buffer_slice2"); write_to_log(log_txt); return NULL; } //first slice ds_median_first_slice(ds_input, buffer_slice); //update progress bar dlg->pbar_simulation_progress.StepIt(); //middle slices { for (k=1; k < ds_input->wZ-1; k++) { if (k%2) { //fill buffer_slice2 ds_median_mid_slice(ds_input, buffer_slice2, k); //copy buffer_slice to ds_input ds_input->copy_DS_slice(buffer_slice, k-1); //for (i=0; i<ds_input->wX, i++) // for (j=0; j<ds_input->wY; j++) // ds_input->data[k-1][j][i] = buffer_slice->data[j][i]; } else { //fill buffer_slice ds_median_mid_slice(ds_input, buffer_slice, k); //copy buffer_slice2 to ds_input ds_input->copy_DS_slice(buffer_slice2, k-1); //for (i=0; i<ds_input->wX, i++) // for (j=0; j<ds_input->wY; j++) // ds_input->data[k-1][j][i] = buffer_slice2->data[j][i]; } //update progress bar dlg->pbar_simulation_progress.StepIt(); } } //last slice { k=ds_input->wZ-1; if (k%2) { //fill buffer_slice2 ds_median_last_slice(ds_input, buffer_slice2); //copy buffer_slice to ds_input ds_input->copy_DS_slice(buffer_slice, k-1); //copy buffer_slice2 to ds_input ds_input->copy_DS_slice(buffer_slice2, k); } else { //fill buffer_slice ds_median_last_slice(ds_input, buffer_slice); //copy buffer_slice2 to ds_input ds_input->copy_DS_slice(buffer_slice2, k-1); //copy buffer_slice to ds_input ds_input->copy_DS_slice(buffer_slice, k); } } //clear variables buffer_slice->clear(); buffer_slice2->clear(); return true; } bool ds_median_w_averaging_w_center(DS_cube* ds_input, void* dlg_share) { //perform 3d median with max neighbours (27) & around median averaging if ((ds_input->wX <3) || (ds_input->wY <3) || (ds_input->wZ <3)) return false; //sample too small register unsigned short int k; //setup the progress bar parameters PoroMediaDialogShare* dlg = (PoroMediaDialogShare*) dlg_share; dlg->pbar_simulation_progress.SetRange(0, ds_input->wZ-1); dlg->pbar_simulation_progress.SetPos(0); dlg->pbar_simulation_progress.SetStep(1); //allocate temporary result slices DS_slice * buffer_slice = new DS_slice(ds_input->wY, ds_input->wX); if (!buffer_slice) { char log_txt[512]; sprintf(log_txt, "ds_median_full_low_mem: out of memory while allocating buffer_slice"); write_to_log(log_txt); return NULL; } DS_slice * buffer_slice2 = new DS_slice(ds_input->wY, ds_input->wX); if (!buffer_slice2) { char log_txt[512]; sprintf(log_txt, "ds_median_full_low_mem: out of memory while allocating buffer_slice2"); write_to_log(log_txt); return NULL; } //first slice ds_median_first_slice(ds_input, buffer_slice); //update progress bar dlg->pbar_simulation_progress.StepIt(); //middle slices { for (k=1; k < ds_input->wZ-1; k++) { if (k%2) { //fill buffer_slice2 ds_median_mid_slice(ds_input, buffer_slice2, k); //copy buffer_slice to ds_input ds_input->copy_DS_slice(buffer_slice, k-1); //for (i=0; i<ds_input->wX, i++) // for (j=0; j<ds_input->wY; j++) // ds_input->data[k-1][j][i] = buffer_slice->data[j][i]; } else { //fill buffer_slice ds_median_mid_slice(ds_input, buffer_slice, k); //copy buffer_slice2 to ds_input ds_input->copy_DS_slice(buffer_slice2, k-1); //for (i=0; i<ds_input->wX, i++) // for (j=0; j<ds_input->wY; j++) // ds_input->data[k-1][j][i] = buffer_slice2->data[j][i]; } //update progress bar dlg->pbar_simulation_progress.StepIt(); } } //last slice { k=ds_input->wZ-1; if (k%2) { //fill buffer_slice2 ds_median_last_slice(ds_input, buffer_slice2); //copy buffer_slice to ds_input ds_input->copy_DS_slice(buffer_slice, k-1); //copy buffer_slice2 to ds_input ds_input->copy_DS_slice(buffer_slice2, k); } else { //fill buffer_slice ds_median_last_slice(ds_input, buffer_slice); //copy buffer_slice2 to ds_input ds_input->copy_DS_slice(buffer_slice2, k-1); //copy buffer_slice to ds_input ds_input->copy_DS_slice(buffer_slice, k); } } //clear variables buffer_slice->clear(); buffer_slice2->clear(); return true; }