17 #ifndef __itkActiveShapeModelGradientSearchMethod_txx
18 #define __itkActiveShapeModelGradientSearchMethod_txx
29 template<
class TImage>
33 m_NumberOfIteration = 1;
34 m_EigenVectors.set_size(0,0);
35 m_EigenValues.set_size(0);
36 m_MeanShape.set_size(0);
37 m_NewShape.set_size( 0);
38 m_DiffVector.set_size( 0 );
40 m_Blimit.set_size( 0 );
49 template<
class TImage>
65 gradientFilter->SetInput( m_Image );
66 gradientFilter->Update();
67 gradImage = gradientFilter->GetOutput();
70 ConstIteratorType constIterator( gradImage, gradImage->GetLargestPossibleRegion());
76 unsigned int numberOfLandmarks = m_MeanShape.size()/2;
77 unsigned int numberOfEigenValues = m_EigenValues.size();
79 m_NewShape = m_MeanShape;
80 centerShape [ 0 ] = 0.0;
81 centerShape [ 1 ] = 0.0;
84 for (
unsigned int j = 0; j < numberOfLandmarks; j++ )
86 mv [ 0 ] = (
unsigned int) (m_NewShape [ 2*j ] + 0.5);
87 mv [ 1 ] = (
unsigned int) (m_NewShape [ 2*j+1 ] + 0.5);
88 sampleLandmarks->PushBack( mv );
89 centerShape [ 0 ] += mv [ 0 ];
90 centerShape [ 1 ] += mv [ 1 ];
92 centerShape [ 0 ] = centerShape [ 0 ] / numberOfLandmarks;
93 centerShape [ 1 ] = centerShape [ 1 ] / numberOfLandmarks;
97 double maximumGrad, deltaX, deltaY;
98 int d, dx, dy, sx, sy;
101 typename VectorType::iterator p6;
106 m_NewShape.set_size( 2*numberOfLandmarks );
109 m_DiffVector.set_size( 2*numberOfLandmarks );
110 m_DiffVector.fill(0);
112 m_Db.set_size( numberOfEigenValues );
115 m_Blimit.set_size( numberOfEigenValues );
119 for (
unsigned int i = 0; i < m_NumberOfIteration; i++ )
121 for (
unsigned int j = 0; j < numberOfLandmarks; j++ )
123 mv = sampleLandmarks->GetMeasurementVector(j);
124 position2D [ 0 ] = mv [ 0 ];
125 position2D [ 1 ] = mv [ 1 ];
126 constIterator.SetIndex(position2D);
127 maximumGrad = constIterator.Get();
128 newPosition2D = position2D;
130 for (
unsigned int identifier = 0; identifier<2; identifier++)
132 posRight[ identifier ] = position2D [ identifier ];
133 posLeft[ identifier ] = position2D [ identifier ];
137 dxyRef1 = sampleLandmarks->GetMeasurementVector(1) -
138 sampleLandmarks->GetMeasurementVector(0);
139 dxyRef2 = sampleLandmarks->GetMeasurementVector(numberOfLandmarks - 1) -
140 sampleLandmarks->GetMeasurementVector(0);
142 if (j == numberOfLandmarks - 1)
144 dxyRef1 = sampleLandmarks->GetMeasurementVector(1) -
145 sampleLandmarks->GetMeasurementVector(j);
146 dxyRef2 = sampleLandmarks->GetMeasurementVector(j-1) -
147 sampleLandmarks->GetMeasurementVector(j);
149 if ((j < numberOfLandmarks - 1) && (j > 1))
151 dxyRef1 = sampleLandmarks->GetMeasurementVector(j + 1) -
152 sampleLandmarks->GetMeasurementVector(j);
153 dxyRef2 = sampleLandmarks->GetMeasurementVector(j-1) -
154 sampleLandmarks->GetMeasurementVector(j);
157 dx = dxyRef2[ 1 ] - dxyRef1[ 1 ];
158 dy = dxyRef1[ 0 ] - dxyRef2[ 0 ];
160 ax = vcl_abs(dx) * 2;
161 ay = vcl_abs(dy) * 2;
178 unsigned int count = 0;
182 while (count < m_LenghtOfProfile)
186 posRight[ 1 ] = posRight[ 1 ] + sy;
187 posLeft[ 1 ] = posLeft[ 1 ] - sy;
190 posRight[ 0 ] = posRight[ 0 ] + sx;
191 posLeft[ 0 ] = posLeft[ 0 ] - sx;
193 position2D[ 0 ] = posRight[ 0 ];
194 position2D[ 1 ] = posRight[ 1 ];
195 constIterator.SetIndex(position2D);
196 if (maximumGrad < constIterator.Get())
198 maximumGrad = constIterator.Get();
199 newPosition2D = position2D;
201 position2D[ 0 ] = posLeft[ 0 ];
202 position2D[ 1 ] = posLeft[ 1 ];
203 constIterator.SetIndex(position2D);
204 if (maximumGrad < constIterator.Get())
206 maximumGrad = constIterator.Get();
207 newPosition2D = position2D;
211 v.push_back (newPosition2D[ 0 ]);
212 v.push_back (newPosition2D[ 1 ]);
217 while (count < m_LenghtOfProfile)
221 posRight[ 0 ] = posRight[ 0 ] + sx;
222 posLeft[ 0 ] = posLeft[ 0 ] - sx;
225 posRight[ 1 ] = posRight[ 1 ] + sy;
226 posLeft[ 1 ] = posLeft[ 1 ] - sy;
228 position2D[ 0 ] = posRight[ 0 ];
229 position2D[ 1 ] = posRight[ 1 ];
230 constIterator.SetIndex(position2D);
231 if (maximumGrad < constIterator.Get())
233 maximumGrad = constIterator.Get();
234 newPosition2D = position2D;
236 position2D[ 0 ] = posLeft[ 0 ];
237 position2D[ 1 ] = posLeft[ 1 ];
238 constIterator.SetIndex(position2D);
239 if (maximumGrad < constIterator.Get())
241 maximumGrad = constIterator.Get();
242 newPosition2D = position2D;
246 v.push_back (newPosition2D[ 0 ]);
247 v.push_back (newPosition2D[ 1 ]);
251 unsigned int row = 0;
252 for (p6 = v.begin(); p6 != v.end(); p6++)
254 m_NewShape[row] = (*p6);
257 v.erase(v.begin(), v.end());
258 sampleLandmarks->Clear();
260 m_DiffVector = m_NewShape - m_MeanShape;
263 m_Db = m_EigenVectors.transpose() * m_DiffVector;
265 for(
unsigned int j = 0; j < numberOfEigenValues; j++)
267 m_Blimit[j] = 2 * vcl_sqrt(m_EigenValues[j]);
270 for(
unsigned int j = 0; j < numberOfEigenValues; j++)
272 if(vcl_fabs(m_Db[j]) > m_Blimit[j])
274 m_Db[j] = ( m_Db[j] / vcl_fabs(m_Db[j]) ) * m_Blimit[j];
278 m_NewShape = m_MeanShape + m_EigenVectors * m_Db;
281 newCenterShape [ 0 ] = 0.0;
282 newCenterShape [ 1 ] = 0.0;
284 for (
unsigned int j = 0; j < numberOfLandmarks; j++ )
286 mv [ 0 ] = (
unsigned int) (m_NewShape [ 2*j ] + 0.5);
287 mv [ 1 ] = (
unsigned int) (m_NewShape [ 2*j+1 ] + 0.5);
288 sampleLandmarks->PushBack( mv );
289 newCenterShape [ 0 ] += mv [ 0 ];
290 newCenterShape [ 1 ] += mv [ 1 ];
292 newCenterShape [ 0 ] = newCenterShape [ 0 ] / numberOfLandmarks;
293 newCenterShape [ 1 ] = newCenterShape [ 1 ] / numberOfLandmarks;
295 deltaX = newCenterShape[ 0 ] - centerShape[ 0 ];
296 deltaY = newCenterShape[ 1 ] - centerShape[ 1 ];
298 for (
unsigned int j = 0; j < numberOfLandmarks; j++ )
300 m_MeanShape [ 2*j ] = m_MeanShape [ 2*j ] + deltaX;
301 m_MeanShape [ 2*j+1 ] = m_MeanShape [ 2*j+1 ] + deltaY;
302 centerShape [ 0 ] += m_MeanShape [ 2*j ];
303 centerShape [ 1 ] += m_MeanShape [ 2*j+1 ];
305 centerShape [ 0 ] = centerShape [ 0 ] / numberOfLandmarks;
306 centerShape [ 1 ] = centerShape [ 1 ] / numberOfLandmarks;
320 template<
class TImage>
336 template<
class TImage>
341 this->Superclass::PrintSelf(os,indent);
342 os << indent <<
"Valid : " << m_Valid << std::endl;
343 os << indent <<
"Mean Shape : " << m_MeanShape << std::endl;
344 os << indent <<
"Eigen Vectors: " << m_EigenVectors << std::endl;
345 os << indent <<
"Eigen Values: " << m_EigenValues << std::endl;
346 os << indent <<
"Lenght of Profile: " << m_LenghtOfProfile << std::endl;
347 os << indent <<
"Number of Iteration: " << m_NumberOfIteration << std::endl;
348 os << indent <<
"Diff Vector: " << m_DiffVector << std::endl;
349 os << indent <<
"Db Vector: " << m_Db << std::endl;
350 os << indent <<
"Blimit Vector: " << m_Blimit << std::endl;
351 os << indent <<
"New Shape: " << m_NewShape << std::endl;
352 os << indent <<
"Image: " << m_Image.GetPointer() << std::endl;
354 itkDebugMacro(<<
" ");
355 itkDebugMacro(<<
"Results of the shape model");
356 itkDebugMacro(<<
"====================================");
358 itkDebugMacro(<<
" ");
359 itkDebugMacro(<<
"================== ");
361 itkDebugMacro(<<
"The new shape: ");
363 itkDebugMacro(<< m_NewShape);
365 itkDebugMacro(<<
" ");
366 itkDebugMacro(<<
"+++++++++++++++++++++++++");