Authors belong to:
- University of LYON http://www.universite-lyon.fr/
- - Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr
+ - Léon Bérard cancer center http://www.centreleonberard.fr
- CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr
This software is distributed WITHOUT ANY WARRANTY; without even
- BSD See included LICENSE.txt file
- CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
-======================================================================-====*/
+===========================================================================**/
#ifndef CLITKIMAGEEXTRACTLINE_CXX
#define CLITKIMAGEEXTRACTLINE_CXX
/**
* @file clitkImageExtractLine.cxx
* @author David Sarrut <David.Sarrut@creatis.insa-lyon.fr>
* @date 23 Feb 2008 08:37:53
+ * @modified by Loïc Grevillot <Loic.Grevillot@creatis.insa-lyon.fr>
+ * @date 10 March 2011
+ * Option -I added, in order to integrate plans perpendicular to a line
+
-------------------------------------------------*/
// clitk include
#include "clitkImageExtractLine_ggo.h"
#include "clitkIO.h"
#include "clitkImageCommon.h"
+#include "clitkCommon.h"
#include <itkLineConstIterator.h>
//--------------------------------------------------------------------
typedef float PixelType;
const unsigned int Dimension=3;
typedef itk::Image<PixelType, Dimension> ImageType;
+ typedef itk::Size<Dimension> SizeType;
// Check options
if (args_info.firstIndex_given != Dimension) {
length = sqrt(length);
// Loop
+// std::vector<double> depth;
+// std::vector<double> values;
+// itk::LineConstIterator<ImageType> iter(input, firstIndex, lastIndex);
+// iter.GoToBegin();
+// while (!iter.IsAtEnd()) {
+// values.push_back(iter.Get());
+// ++iter;
+// }
+// double step = length/values.size();
+
std::vector<double> depth;
std::vector<double> values;
itk::LineConstIterator<ImageType> iter(input, firstIndex, lastIndex);
- iter.GoToBegin();
- while (!iter.IsAtEnd()) {
- values.push_back(iter.Get());
- ++iter;
+ int direction=0;
+
+ // args_info.integral_arg=0, so, it does not compute the integral
+ if (args_info.integral_arg==0){
+ iter.GoToBegin();
+ while (!iter.IsAtEnd()) {
+ values.push_back(iter.Get());
+ ++iter;
+ }
+ }
+ // args_info.integral_arg=1, so, it computes the integral
+ if (args_info.integral_arg!=0){
+ int a=0, b=0, c=0;
+ if (args_info.integralAxis_arg==0){
+ a=1;
+ b=0;
+ c=2;
+ }
+ else if (args_info.integralAxis_arg==1){
+ a=0;
+ b=1;
+ c=2;
+ }
+ else if (args_info.integralAxis_arg==2){
+ a=2;
+ b=0;
+ c=1;
+ }
+ else {std::cout<<"Wrong axis"<<std::endl;
+ exit(0);
+ }
+
+ length=(lastIndex[b]-firstIndex[b])*spacing[b];
+
+ std::cout<<"The line is extracted along axis "<<args_info.integralAxis_arg<<std::endl;
+ std::cout<<"The line is integrated between "<<args_info.firstIndex_arg[a]<<" and "<<args_info.lastIndex_arg[a]<<" along axis "<<a<<std::endl;
+ std::cout<<"The line is integrated between "<<args_info.firstIndex_arg[c]<<" and "<<args_info.lastIndex_arg[c]<<" along axis "<<c<<std::endl;
+
+ SizeType dim;
+ dim=input->GetLargestPossibleRegion().GetSize();
+ DD(dim);
+ DD(direction);
+
+ std::vector<double> val(dim[b]);
+ for (size_t i=0; i<dim[b]; i++)
+ val[i]=0;
+
+ int k;
+
+ for (int i=args_info.firstIndex_arg[a]; i<args_info.lastIndex_arg[a]; i++){
+ for (int j=args_info.firstIndex_arg[c]; j<args_info.lastIndex_arg[c]; j++){
+ // std::cout<<"i "<<i<<" j "<<j<<std::endl;
+ k=0;
+ firstIndex[a]=i;
+ firstIndex[c]=j;
+ lastIndex[a]=i;
+ lastIndex[c]=j;
+ // std::cout<<"A"<<std::endl;
+ itk::LineConstIterator<ImageType> iter(input, firstIndex, lastIndex);
+ iter.GoToBegin();
+ // std::cout<<"B"<<std::endl;
+ val[k]+=iter.Get();
+ k++;
+ // std::cout<<"C"<<std::endl;
+ while (!iter.IsAtEnd()) {
+ // std::cout<<"D "<<k<<std::endl;
+ val[k]+=iter.Get();
+ ++iter;
+ k++;
+ }
+ }
+ }
+
+ for (unsigned int i=0; i<dim[b]; i++){
+ values.push_back(val[i]);
+ }
}
+
double step = length/values.size();
-
+ DD(values.size());
+
// If isocenter is used
double isoDistance = 0.0;
if (args_info.isocenter_given) { // isoCenter is in mm