1 /*=========================================================================
4 Module: $RCSfile: clitkSignalMeanPositionFilter.cxx,v $
6 Date: $Date: 2010/01/06 13:31:57 $
7 Version: $Revision: 1.1 $
9 Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
10 l'Image). All rights reserved. See Doc/License.txt or
11 http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details.
13 This software is distributed WITHOUT ANY WARRANTY; without even
14 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 PURPOSE. See the above copyright notices for more information.
17 =========================================================================*/
19 #include "clitkSignalMeanPositionFilter.h"
21 //---------------------------------------------------------------------
22 void clitk::SignalMeanPositionFilter::SetParameters(gengetopt_args_info_clitkSignalMeanPositionTracking & args) {
25 mOutputFilenameIsSet = false;
26 mOutputResidualFilenameIsSet = false;
27 mInput.Read(args_info.input_arg);
28 mAugmentationDelay = args_info.delay_arg;
29 mIsAdaptiveMethod = false;
31 if (args_info.eta_given) {
32 mEta = args_info.eta_arg;
35 mMaxIteration = args_info.iter_arg;
36 if (args_info.output_given) {
37 mOutputFilenameIsSet = true;
38 mOutputFilename = args_info.output_arg;
40 if (args_info.residual_given) {
41 mOutputResidualFilenameIsSet = true;
42 mOutputResidualFilename = args_info.residual_arg;
44 if (args_info.augmented_given) {
45 mOutputAugmentedFilenameIsSet = true;
46 mOutputAugmentedFilename = args_info.augmented_arg;
48 mVerbose = args_info.verbose_flag;
49 mVerboseIteration = args_info.verbose_iteration_flag;
50 if (args_info.L_given) {
51 mIsAdaptiveMethod = true;
52 mWindowLength = args_info.L_arg;
55 //---------------------------------------------------------------------
58 //---------------------------------------------------------------------
59 void clitk::SignalMeanPositionFilter::Update() {
63 // clitk::Signal temp;
64 // temp.resize(mInput.size()*e);
65 // for(unsigned int i=0; i<temp.size(); i++) {
66 // int index = lrint(floor((double)i/e));
67 // double res = (double)i/e - index;
70 // temp[i] = mInput[index] + res*(mInput[index+1]-mInput[index])/e;
72 // mInput.resize(temp.size());
73 for (unsigned int i=0; i<mInput.size(); i++) mInput[i] = mInput[i]+(double)i/(double)mInput.size();
75 for (unsigned int i=0; i<mInput.size(); i++) {
76 mInput[i] = (0.8+((double)rand()/ (double)RAND_MAX)*0.4) * mInput[i];
81 openFileForWriting(os, "input.dat");
82 for(unsigned int i=0; i<mInput.size(); i++) os << mInput[i] << std::endl;
87 // Compute augmented space
89 std::cout << "Computing augmented space with delay = " << mAugmentationDelay
90 << ", number of samples is " << mInput.size()-mAugmentationDelay
93 ComputeAugmentedSpace(mInput, mAugmentedInputX, mAugmentedInputY, mAugmentationDelay);
95 // Output augmented state
96 if (mOutputAugmentedFilenameIsSet) {
98 openFileForWriting(os, mOutputAugmentedFilename);
99 for(unsigned int i=0; i<(unsigned int)mWindowLength; i++) {
100 os << mAugmentedInputX[i] << " " << mAugmentedInputY[i] << std::endl;
105 // Initial starting ellipse
106 Ellipse An; // starting point
107 if (!mEtaIsSet) mEta = -1;
108 An.InitialiseEllipseFitting(mEta, mWindowLength, mAugmentedInputX, mAugmentedInputY);
111 std::cout << "Eta is " << mEta << std::endl;
113 Ellipse AnInitial(An);
115 std::cout << "Set initial ellipse to c=" << An.ComputeCenter()
116 << " and axes=" << An.ComputeSemiAxeLengths() << std::endl;
120 if (mIsAdaptiveMethod) {
121 AdaptiveFitEllipse(An);
128 std::cout << "Result is " << An << std::endl;
129 std::cout << "Center is " << An.ComputeCenter() << std::endl;
130 std::cout << "SemiAxis are " << An.ComputeSemiAxeLengths() << std::endl;
131 std::cout << "Angle is " << rad2deg(An.ComputeAngleInRad()) << " deg" << std::endl;
133 if (mOutputFilenameIsSet) {
135 openFileForWriting(os, mOutputFilename);
136 os << AnInitial.ComputeCenter()[0] << " " << AnInitial.ComputeCenter()[1] << " "
137 << AnInitial.ComputeSemiAxeLengths()[0] << " " << AnInitial.ComputeSemiAxeLengths()[1] << " "
138 << AnInitial.ComputeAngleInRad();
139 for(int i=0; i<6; i++) os << AnInitial[i] << " " ;
142 os << An.ComputeCenter()[0] << " " << An.ComputeCenter()[1] << " "
143 << An.ComputeSemiAxeLengths()[0] << " " << An.ComputeSemiAxeLengths()[1] << " "
144 << An.ComputeAngleInRad();
145 for(int i=0; i<6; i++) os << An[i] << " ";
149 openFileForWriting(os, "centers.dat");
150 for(unsigned int i=0; i<mCenters.size(); i++) {
151 os << mCenters[i][0] << " " << mCenters[i][1] << std::endl;
157 if (mOutputResidualFilenameIsSet) {
159 openFileForWriting(os, mOutputResidualFilename);
160 for(unsigned int i=0; i<mCurrentResidual.size(); i++) {
162 os << mCurrentResidual[i] << std::endl;
167 //---------------------------------------------------------------------
170 //---------------------------------------------------------------------
171 void clitk::SignalMeanPositionFilter::ComputeAugmentedSpace(const clitk::Signal & input,
172 clitk::Signal & outputX,
173 clitk::Signal & outputY,
174 unsigned int delay) {
175 if (input.size() <= delay) {
176 std::cerr << "Error in signal length is " << input.size()
177 << " while delay is " << delay << " : too short. Abort." << std::endl;
180 outputX.resize(input.size()-delay);
181 outputY.resize(input.size()-delay);
182 for(unsigned int i=0; i<outputX.size(); i++) {
183 outputX[i] = input[i+delay];
184 outputY[i] = input[i];
188 //---------------------------------------------------------------------
191 //---------------------------------------------------------------------
192 void clitk::SignalMeanPositionFilter::FitEllipse(clitk::Ellipse & An) {
194 mCurrentResidual.clear();
195 while (n<mMaxIteration) {
196 double r = An.EllipseFittingNextIteration();
197 mCurrentResidual.push_back(r);
199 if (mVerboseIteration) {
200 std::cout.precision(3);
201 std::cout << "A(" << n << ")=" << An
202 << " c=" << An.ComputeCenter()
203 << " ax=" << An.ComputeSemiAxeLengths()
204 << " theta=" << rad2deg(An.ComputeAngleInRad());
205 std::cout.precision(10);
206 std::cout << " R=" << r << std::endl;
210 //---------------------------------------------------------------------
213 //---------------------------------------------------------------------
214 void clitk::SignalMeanPositionFilter::AdaptiveFitEllipse(clitk::Ellipse & An) {
215 for(unsigned int t=0; t<(unsigned int)args_info.t_arg; t++) {
217 An.UpdateSMatrix(t, mWindowLength, mAugmentedInputX, mAugmentedInputY);
218 mCenters.push_back(An.ComputeCenter());
222 //---------------------------------------------------------------------