Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 090c54d

Browse files
committed
BUG: Fix sigma calculation
The sigma value was changed in order to correctly calculates over foreground area. In addition, the m_B parameter was changed to m_BackgroundValue
1 parent 52a8954 commit 090c54d

2 files changed

Lines changed: 31 additions & 206 deletions

File tree

Modules/Features/SampEn2DImageCalculator/itkSampEn2DImageCalculator.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ class SampEn2DImageCalculator:public Object
8989
itkSetMacro(D, DParameterValueType);
9090

9191
/** Set the B (background value) parameter value. */
92-
itkSetMacro(B, BParameterValueType);
92+
itkSetMacro(BackgroundValue, BParameterValueType);
9393

9494
/** Get the M parameter value. */
9595
itkGetMacro(M, MParameterValueType);
@@ -101,7 +101,7 @@ class SampEn2DImageCalculator:public Object
101101
itkGetMacro(D, DParameterValueType);
102102

103103
/** Get the B parameter value. */
104-
itkGetMacro(B, BParameterValueType);
104+
itkGetMacro(BackgroundValue, BParameterValueType);
105105

106106
/** Compute the two-dimensional sample entropy value of the input image. */
107107
void ComputeEntropy(void);
@@ -127,7 +127,7 @@ class SampEn2DImageCalculator:public Object
127127
MParameterValueType m_M;
128128
RParameterValueType m_R;
129129
DParameterValueType m_D;
130-
BParameterValueType m_B;
130+
BParameterValueType m_BackgroundValue;
131131
ImageConstPointer m_Image;
132132

133133
/** Test to check the M, R, D and B parameters values */

Modules/Features/SampEn2DImageCalculator/itkSampEn2DImageCalculator.hxx

Lines changed: 28 additions & 203 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)