@@ -36,7 +36,7 @@ SampEn2DImageCalculator< TInputImage >
3636 m_M = 1 ;
3737 m_R = 0.10 ;
3838 m_D = 1 ;
39- m_B = 0.0 ;
39+ m_BackgroundValue = 0.0 ;
4040 m_RegionSetByUser = false ;
4141}
4242
@@ -58,31 +58,41 @@ SampEn2DImageCalculator< TInputImage >
5858 typename ImageType::SizeType radius;
5959 radius.Fill (static_cast <int >(m_M));
6060
61- typedef itk::StatisticsImageFilter<ImageType> StatisticsImageFilterType;
62- typename StatisticsImageFilterType::Pointer statisticsImageFilter = StatisticsImageFilterType::New ();
63- statisticsImageFilter->SetInput (m_Image);
64- statisticsImageFilter->Update ();
65-
66- DoublePixelType tolerance = m_R*statisticsImageFilter->GetSigma ();
67-
6861 typename ImageType::SizeType size = m_Region.GetSize ();
6962
70- // clock_t begin, end;
71- // begin=clock();
72-
7363 m_Nx = size[0 ]; // ncols
7464 m_Ny = size[1 ]; // nrows
7565
7666 double image_matrix[m_Nx*m_Ny];
67+ double sigma = 0.0 , mean = 0.0 ;
68+ unsigned int N = 0 ;
7769
7870 ConstRegionIteratorType copyIt (m_Image, m_Region);
7971 copyIt.GoToBegin ();
8072 int count=0 ;
8173 while (!copyIt.IsAtEnd ()) {
8274 image_matrix[count++]=copyIt.Get ();
75+
76+ if (copyIt.Get ()!=m_BackgroundValue) {
77+ N++;
78+ mean+=copyIt.Get ();
79+ }
8380 ++copyIt;
8481 }
82+ mean/=N;
8583
84+ // Calculating stantard deviation only in the foreground area
85+ copyIt.GoToBegin ();
86+ while (!copyIt.IsAtEnd ()) {
87+ if (copyIt.Get ()!=m_BackgroundValue) {
88+ sigma+=pow (copyIt.Get ()-mean,2.0 );
89+ }
90+ ++copyIt;
91+ }
92+ sigma/=(N-1 );
93+ sigma=sqrt (sigma);
94+
95+ DoublePixelType tolerance = m_R*sigma;
8696
8797 // Limit indexes for cols and rows
8898 int xLim = m_Nx - m_M*m_D;
@@ -153,7 +163,7 @@ SampEn2DImageCalculator< TInputImage >
153163 // check if it is a valid pattern
154164 valid = true ;
155165 for (k=0 ; k < nmm1; k++) {
156- if (image_matrix[ki+kdmm1[k]]==bv ) {
166+ if (image_matrix[ki+kdmm1[k]]==m_BackgroundValue ) {
157167 valid = false ;
158168 break ;
159169 }
@@ -167,14 +177,10 @@ SampEn2DImageCalculator< TInputImage >
167177 jlim = (j*m_Nx)+xLim; // set limit index in current row for moving pattern
168178
169179 while (kj < jlim ) { // go across columns
170- // for debug
171- // printf("(%d) ",kj);
172-
173-
174180 // pattern matching for m using tolerance
175181 for (k=0 ; k < nm; k++) {
176182 v = image_matrix[kj+kdm[k]];
177- if (v != bv ) {// if it is not a background pixel
183+ if (v != m_BackgroundValue ) {// if it is not a background pixel
178184 d = fabs (image_matrix[ki+kdm[k]] - v);
179185 if (d >= tolerance) {
180186 d = -1.0 ; // it is not a similar pattern
@@ -192,7 +198,7 @@ SampEn2DImageCalculator< TInputImage >
192198 // pattern matching for m+1 using tolerance
193199 for (kk=0 ; kk < nm1; kk++) {
194200 v = image_matrix[kj+kdm1[kk]];
195- if (v != bv ) {// if it is not a background pixel
201+ if (v != m_BackgroundValue ) {// if it is not a background pixel
196202 d = fabs (image_matrix[ki+kdm1[kk]] - v);
197203 if (d >= tolerance) {
198204 d = -1.0 ; // it is not a similar pattern
@@ -207,7 +213,7 @@ SampEn2DImageCalculator< TInputImage >
207213 if (valid) { // is pattern valid so far?
208214 // check remaining pixels
209215 while (++kk < nm1) {
210- if (image_matrix[kj+kdm1[kk]] == bv ) // if it is a background pixel
216+ if (image_matrix[kj+kdm1[kk]] == m_BackgroundValue ) // if it is a background pixel
211217 valid = false ; // it is not a valid pattern
212218 }
213219
@@ -233,13 +239,8 @@ SampEn2DImageCalculator< TInputImage >
233239 }// if valid pattern
234240
235241 ki++;
236- } // while ki
237- // for debug
238- // printf("\n");
239-
242+ } // while ki
240243 } // for i
241- // for debug
242- // printf("%d \n %d \n %f \n %f \n",Cim,Cim1,den,bv);
243244
244245 /* outputs: probabilities */
245246 Cm = ((static_cast <double >(Cim)/(den-1.0 ))/den)*2.0 ;
@@ -250,182 +251,6 @@ SampEn2DImageCalculator< TInputImage >
250251 free (kdmm1);
251252
252253 m_Entropy = static_cast <double >(-1 )*std::log (static_cast <double >(Cm1)/static_cast <double >(Cm));
253-
254-
255- /* - - - - - - - - - -*/
256- // //Limit indexes for cols and rows
257- // int xLim = m_Nx - m_M*m_D;
258- // int yLim = m_Ny - m_M*m_D;
259-
260- // // Total number of valid patterns (for both m and m+1)
261- // double den=0;
262-
263- // //Counters of similar patterns for m and m+1
264- // unsigned int B, A; // for each template pattern
265- // unsigned long long Cim=0, Cim1=0; //sum over all template patters
266-
267- // //Probabilities of patterns ocurrence for m and m+1
268- // double Cm, Cm1;
269-
270-
271- // int i, j; //col's running indexes
272- // int ilim, jlim; // limits for pattern's indexes
273-
274- // //Pre-allocating indexes shift for patterns matching and validation
275- // int nm = m_M*m_M;
276- // int nm1 = 2*m_M+1;
277- // int nmm1 = nm+nm1;
278-
279- // int *kdm, *kdm1, *kdmm1; //arrays with shift indexes for m and m+1 matching and validation
280- // if ((kdm = (int *) calloc(nm, sizeof(int))) == NULL) exit(1);
281- // if ((kdm1 = (int *) calloc(nm1, sizeof(int))) == NULL) exit(1);
282- // if ((kdmm1 = (int *) calloc(nmm1, sizeof(int))) == NULL) exit(1);
283-
284- // int kk;
285- // int k=0;
286- // for (i = 0; i < m_M ; i++){
287- // kk = m_Ny * i * m_D;
288- // for (j = 0; j < m_M ; j++ ){
289- // kdm[k] = kk + j*m_D;
290- // kdmm1[k] = kdm[k];
291- // k++;
292- // }
293- // }
294- // k=0;
295- // for (j = 0; j <= m_M; j++) { // Compares column m+1
296- // kdm1[k] = (m_Ny*m_M +j) * m_D;
297- // kdmm1[k+nm] = kdm1[k];
298- // k++;
299- // }
300- // for (i = 0; i < m_M; i++) { // Compares row m+1
301- // kdm1[k] = (m_Ny*i + m_M) * m_D;
302- // kdmm1[k+nm] = kdm1[k];
303- // k++;
304- // }
305- // //End pre-allocating
306-
307- // int ki, kj; //pattern's indexes
308- // double d; //differences during pattern matching
309- // bool valid; //valid pattern (has no background)
310- // double v; //a moving pattern pixel value
311-
312- // /* Starts running */
313- // for(i=0; i<xLim; i++) { //for each column
314- // ilim = (i*m_Ny)+yLim; //set limit index for template pattern
315-
316- // ki = i*m_Ny; //ki is the template pattern
317-
318- // while (ki < ilim) {
319- // B = 0;
320- // A = 0;
321-
322- // //check if it is a valid pattern
323- // valid = true;
324- // for (k=0; k < nmm1; k++) {
325- // if(image_matrix[ki+kdmm1[k]]==bv) {
326- // valid = false;
327- // break;
328- // }
329- // }
330-
331- // if(valid) {//if it is a valid pattern (has no background)
332-
333- // kj = ki+1; //kj is the moving pattern
334-
335- // for(j=i; j<xLim; j++) { //for each column
336- // jlim = (j*m_Ny)+yLim; //set limit index for moving pattern
337-
338- // while (kj < jlim ) {
339- // //for debug
340- // //printf("(%d) ",kj);
341-
342-
343- // //pattern matching for m with tolerance r
344- // for (k=0; k < nm; k++) {
345- // v = image_matrix[kj+kdm[k]];
346- // if(v != bv) {//if it is not a background pixel
347- // d = fabs(image_matrix[ki+kdm[k]] - v);
348- // if (d >= r) {
349- // d = -1.0; //it is not a similar pattern
350- // break;
351- // }
352- // } else {
353- // d = -1.0; //it is not a valid pattern
354- // break;
355- // }
356- // }
357-
358- // // is pattern valid and similar for m?
359- // if (d != -1.0) {
360- // valid=true;
361- // //pattern matching for m+1 with tolerance r
362- // for (kk=0; kk < nm1; kk++) {
363- // v = image_matrix[kj+kdm1[kk]];
364- // if(v != bv) {//if it is not a background pixel
365- // d = fabs(image_matrix[ki+kdm1[kk]] - v);
366- // if (d >= r) {
367- // d = -1.0; //it is not a similar pattern
368- // break;
369- // }
370- // } else {
371- // valid = false; //it is not a valid pattern
372- // break;
373- // }
374- // }
375-
376- // if (valid) { // is pattern valid so far?
377- // //check remaining pixels
378- // while(++kk < nm1) {
379- // if(image_matrix[kj+kdm1[kk]] == bv) //if it is a background pixel
380- // valid = false; //it is not a valid pattern
381- // }
382-
383- // // is pattern valid?
384- // if (valid) {
385- // B++; //increment m counter
386- // if (d != -1.0) // is pattern similar for m+1?
387- // A++; //increment m+1 counter
388- // }
389- // }
390- // }// if valid and similar for m
391-
392- // kj++;
393- // }//while kj
394-
395- // kj= (j+1)*m_Ny;
396- // }//for j
397-
398- // Cim += B;
399- // Cim1 += A;
400-
401- // den++;
402- // }// if valid pattern
403-
404- // ki++;
405- // } //while ki
406- // //for debug
407- // //printf("\n");
408-
409- // } //for i
410- // //for debug
411- // //printf("%d \n %d \n %f \n %f \n",Cim,Cim1,den,bv);
412-
413- // /* outputs: probabilities */
414- // Cm = ((Cim/(den-1))/den)*2;
415- // Cm1 = ((Cim1/(den-1))/den)*2;
416-
417- // free(kdm);
418- // free(kdm1);
419- // free(kdmm1);
420-
421- // m_Entropy = static_cast<double>(-1)*std::log(static_cast<double>(Cm1)/static_cast<double>(Cm));
422- /* - - - - - - - - - -*/
423-
424-
425- // end=clock();
426- // double time = (double)(end-begin)/CLOCKS_PER_SEC;
427- // cout<<"time "<<time<<endl;
428-
429254}
430255
431256
@@ -472,10 +297,10 @@ SampEn2DImageCalculator< TInputImage >
472297 }
473298
474299// TODO -- B must be double
475- // if (m_B < 0)
300+ // if (m_BackgroundValue < 0)
476301 // {
477302 // itkWarningMacro( << "Wrong value for B parameters: "
478- // << m_B << std::endl
303+ // << m_BackgroundValue << std::endl
479304 // << "B must be a float point positive value.");
480305 // }
481306}
0 commit comments