]> Creatis software - clitk.git/commitdiff
Merge branch 'master' of git.creatis.insa-lyon.fr:clitk
authorSimon Rit <simon.rit@creatis.insa-lyon.fr>
Thu, 19 Apr 2012 12:38:27 +0000 (14:38 +0200)
committerSimon Rit <simon.rit@creatis.insa-lyon.fr>
Thu, 19 Apr 2012 12:38:27 +0000 (14:38 +0200)
CMakeLists.txt
cmake/build_opt.cmake
common/clitkTransformUtilities.cxx
common/clitkTransformUtilities.h
scripts/CMakeLists.txt [new file with mode: 0644]
scripts/calculate_contour_stats.sh [new file with mode: 0755]
tools/clitkAffineTransform.ggo
tools/clitkAffineTransformGenericFilter.txx
vv/vvSlicer.cxx
vv/vvSlicerManager.cxx

index 4cd0dc9de7c8d8e4a4a27038a2d10f64e5fd8175..0c65b285c2ad73dad25ea45ee59dd8b76fd00002 100644 (file)
@@ -23,3 +23,4 @@ ADD_SUBDIRECTORY(${CLITK_SOURCE_DIR}/common ${PROJECT_BINARY_DIR}/common)
 ADD_SUBDIRECTORY(${CLITK_SOURCE_DIR}/tools ${PROJECT_BINARY_DIR}/tools)
 ADD_SUBDIRECTORY(${CLITK_SOURCE_DIR}/segmentation ${PROJECT_BINARY_DIR}/segmentation)
 ADD_SUBDIRECTORY(${CLITK_SOURCE_DIR}/registration ${PROJECT_BINARY_DIR}/registration)
+ADD_SUBDIRECTORY(${CLITK_SOURCE_DIR}/scripts ${PROJECT_BINARY_DIR}/scripts)
index a8f10ee13386e604411783e7e1c6b06304d5d5fa..d7c60aa12268f5e0054119ea358ecb6feb856f5f 100644 (file)
@@ -34,21 +34,3 @@ IF(BUILD_TESTING)
   ADD_SUBDIRECTORY(${CLITK_SOURCE_DIR}/tests ${PROJECT_BINARY_DIR}/tests)
 ENDIF(BUILD_TESTING)
 
-#=========================================================
-# Install scripts when running make install
-SET(SCRIPTS 
-  ${CLITK_SOURCE_DIR}/scripts/calculate_motion_amplitude.sh
-  ${CLITK_SOURCE_DIR}/scripts/midp_common.sh
-  ${CLITK_SOURCE_DIR}/scripts/registration.sh
-  ${CLITK_SOURCE_DIR}/scripts/create_midP.sh
-  ${CLITK_SOURCE_DIR}/scripts/create_midP-2.0.sh        
-  ${CLITK_SOURCE_DIR}/scripts/create_mhd_4D.sh          
-  ${CLITK_SOURCE_DIR}/scripts/create_mhd_4D_pattern.sh  
-  ${CLITK_SOURCE_DIR}/scripts/create_midP_masks.sh  
-  ${CLITK_SOURCE_DIR}/scripts/create_midP_masks-2.0.sh  
-  ${CLITK_SOURCE_DIR}/scripts/pts_to_landmarks.sh
-  ${CLITK_SOURCE_DIR}/scripts/create_mhd_3D.sh
-  ${CLITK_SOURCE_DIR}/scripts/dicom_info.sh
-)
-
-INSTALL (FILES ${SCRIPTS} DESTINATION bin PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_EXECUTE WORLD_EXECUTE)
index 069fc70554022422781eb7bdabad1b454d1f9f01..ef210d70ae3318c5dbb778557787d9d86b51677e 100644 (file)
 namespace clitk
 {
 
+//--------------------------------------------------------------------
+template < >
+itk::Matrix<double, 3, 3>
+GetForwardAffineMatrix<2>(itk::Array<double> transformParameters)
+{
+  return GetForwardAffineMatrix2D(transformParameters);
+}
+
+//--------------------------------------------------------------------
+template < >
+itk::Matrix<double, 4, 4>
+GetForwardAffineMatrix<3>(itk::Array<double> transformParameters)
+{
+  return GetForwardAffineMatrix3D(transformParameters);
+}
+
 //--------------------------------------------------------------------
 template < >
 itk::Matrix<double, 3, 3>
@@ -37,4 +53,18 @@ GetBackwardAffineMatrix<3>(itk::Array<double> transformParameters)
   return GetBackwardAffineMatrix3D(transformParameters);
 }
 
+//--------------------------------------------------------------------
+template <>
+itk::Matrix<double, 2, 2> GetRotationMatrix<2>(itk::Array<double> rotationParameters)
+{
+  return GetRotationMatrix2D(rotationParameters);
+}
+
+//--------------------------------------------------------------------
+template <>
+itk::Matrix<double, 3, 3> GetRotationMatrix<3>(itk::Array<double> rotationParameters)
+{
+  return GetRotationMatrix3D(rotationParameters);
+}
+
 }
index a6fdd8c6a33f2670d9d665896d458f9cb1c7462c..3bdf22026ee0ab969a5fe8f6274db3a0fd4fa2e3 100644 (file)
@@ -32,12 +32,15 @@ namespace clitk
   //============================================================================
   itk::Matrix<double, 3, 3> GetForwardAffineMatrix2D(itk::Array<double> transformParameters);
   itk::Matrix<double, 4, 4> GetForwardAffineMatrix3D(itk::Array<double> transformParameters);
+  template <unsigned int Dimension > itk::Matrix<double, Dimension+1, Dimension+1> GetForwardAffineMatrix(itk::Array<double> transformParameters);
 
   itk::Matrix<double, 3, 3> GetBackwardAffineMatrix2D(itk::Array<double> transformParameters);
   itk::Matrix<double, 4, 4> GetBackwardAffineMatrix3D(itk::Array<double> transformParameters);
   template <unsigned int Dimension > itk::Matrix<double, Dimension+1, Dimension+1> GetBackwardAffineMatrix(itk::Array<double> transformParameters);
 
   itk::Matrix<double, 3, 3> GetRotationMatrix3D(itk::Array<double> rotationParameters);
+  itk::Matrix<double, 2, 2> GetRotationMatrix2D(itk::Array<double> rotationParameters);
+  template <unsigned int Dimension> itk::Matrix<double, Dimension, Dimension> GetRotationMatrix(itk::Array<double> rotationParameters);
   itk::Point<double, 3> GetRotatedPoint3D(itk::Array<double> rotationParameters, itk::Point<double, 3> input);
   itk::Matrix<double, 4, 4> GetCenteredRotationMatrix3D(itk::Array<double> rotationParameters,itk::Point<double,3> centerOfRotation);
   //   itk::Matrix<double, 4, 4> GetComposedMatrix3D(itk::Matrix<double, 4, 4> firstTransform, itk::Matrix<double, 4, 4> secondTransform);
@@ -166,9 +169,17 @@ namespace clitk
     matrix[2][2]= cos(rotationParameters[0])*cos(rotationParameters[1]);
     return matrix;
   }
+
+  inline itk::Matrix<double, 2, 2> GetRotationMatrix2D(itk::Array<double> rotationParameters)
+  {
+    itk::Matrix<double, 2, 2> matrix;
+    matrix[0][0] = cos(rotationParameters[0]);
+    matrix[1][0] = sin(rotationParameters[0]);
+    matrix[0][1] = -matrix[1][0];
+    matrix[1][1] = matrix[0][0];
+    return matrix;
+  }
+
   //========================================================================================
   inline  itk::Point<double, 3> GetRotatedPoint3D(itk::Array<double> rotationParameters, itk::Point<double, 3> input)
   {
diff --git a/scripts/CMakeLists.txt b/scripts/CMakeLists.txt
new file mode 100644 (file)
index 0000000..41ace96
--- /dev/null
@@ -0,0 +1,19 @@
+#=========================================================
+# Install scripts when running make install
+SET(SCRIPTS 
+  ${CLITK_SOURCE_DIR}/scripts/calculate_motion_amplitude.sh
+  ${CLITK_SOURCE_DIR}/scripts/calculate_contour_stats.sh
+  ${CLITK_SOURCE_DIR}/scripts/midp_common.sh
+  ${CLITK_SOURCE_DIR}/scripts/registration.sh
+  ${CLITK_SOURCE_DIR}/scripts/create_midP.sh
+  ${CLITK_SOURCE_DIR}/scripts/create_midP-2.0.sh        
+  ${CLITK_SOURCE_DIR}/scripts/create_mhd_4D.sh          
+  ${CLITK_SOURCE_DIR}/scripts/create_mhd_4D_pattern.sh  
+  ${CLITK_SOURCE_DIR}/scripts/create_midP_masks.sh  
+  ${CLITK_SOURCE_DIR}/scripts/create_midP_masks-2.0.sh  
+  ${CLITK_SOURCE_DIR}/scripts/pts_to_landmarks.sh
+  ${CLITK_SOURCE_DIR}/scripts/create_mhd_3D.sh
+  ${CLITK_SOURCE_DIR}/scripts/dicom_info.sh
+)
+
+INSTALL (FILES ${SCRIPTS} DESTINATION bin PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_EXECUTE WORLD_EXECUTE)
diff --git a/scripts/calculate_contour_stats.sh b/scripts/calculate_contour_stats.sh
new file mode 100755 (executable)
index 0000000..b15caa8
--- /dev/null
@@ -0,0 +1,121 @@
+#! /bin/bash +x 
+
+select_contour_gui()
+{
+  local roi_list=$@
+  roi=`zenity --list --title="Available Contours" --column="Please choose a contour:" $roi_list`
+  case $? in
+    0)
+    if [ -z $roi ]
+    then
+      zenity --warning --text="You must choose one contour."
+      select_contour $roi_list
+    else
+      rtstruct_roi_name=$roi
+    fi;;
+    1)
+    if zenity --question --text="Do you really wish to quit?"
+    then
+      exit
+    else
+      select_contour $roi_list
+    fi;;
+    -1)
+      zenity --error --text="Unexpected error. Please relaunch the application."
+      exit;;
+  esac
+}
+
+select_contour()
+{
+  local roi_list=$@
+  echo "Available Contours:" 
+  for r in $roi_list; do
+    echo $r
+  done
+
+  echo "Please choose a contour number:"
+  read rtstruct_roi_number
+}
+
+select_roi()
+{
+  rtstruct_roi_name_list=( `clitkDicomInfo ${rtstruct_file} | grep "3006|0026" | cut -d '[' -f 4 | sed 's/| V 3006|0026[LO] [ROI Name] \|]//'` )
+  rtstruct_roi_number_list=( `clitkDicomInfo ${rtstruct_file} | grep "3006|0022" | cut -d '[' -f 4 | sed 's/| V 3006|0026[LO] [ROI Number] \|]//'` )
+  rtstruct_roi_list=( )
+  for i in $(seq 0 1 $(( ${#rtstruct_roi_name_list[@]} - 1 ))); do
+    rtstruct_roi_list[$i]=${rtstruct_roi_number_list[$i]}:${rtstruct_roi_name_list[$i]}
+  done
+
+  if [ $gui_mode = 1 ]; then
+    select_contour_gui ${rtstruct_roi_list[@]}
+    rtstruct_roi=`echo ${rtstruct_roi_name} | cut -d ':' -f 1`
+    rtstruct_roi_name=`echo ${rtstruct_roi_name} | cut -d ':' -f 2`
+  else
+    select_contour ${rtstruct_roi_list[@]}
+    rtstruct_roi=$rtstruct_roi_number
+    rtstruct_roi_name=${rtstruct_roi_name_list[$(( $rtstruct_roi_number - 1))]}
+  fi
+}
+
+############# main 
+
+if echo $* | grep "\-h"; then
+  echo Usage: calculate_motion_amplitude.sh { RTSTRUCT_FILE REFERENCE_IMAGE | --gui }
+
+  exit 0
+fi
+
+
+rtstruct_roi=0
+
+if echo $* | grep "\-\-gui" > /dev/null 2>&1; then
+  if [ $# != 1 ]; then
+    echo Invalid arguments. Type \'`basename $0` -h\' for help
+    exit -1
+  fi
+
+  gui_mode=1
+  rtstruct_file=`zenity --file-selection --title="Select RT Struct file."`
+  select_roi
+  rtstruct_ref_image=`zenity --file-selection --title="Select Reference Image."`
+else
+  if [ $# != 2 ]; then
+    echo Invalid arguments. Type \'`basename $0` -h\' for help
+    exit -1
+  fi
+
+  gui_mode=0
+  rtstruct_file=$1
+  rtstruct_ref_image=$2
+  select_roi
+fi
+
+
+#echo "Processing \"${rtstruct_roi_list[$roi_struct]}\"..."
+# create ROI mask from rtstruct
+roi_mask=roi_${rtstruct_roi_name}.mhd
+clitkDicomRTStruct2Image -i ${rtstruct_file} -o ${roi_mask} -j ${rtstruct_ref_image} -r ${rtstruct_roi} 2> /tmp/err.txt
+if cat /tmp/err.txt | grep -q "No ROI"; then
+  echo Invalid contour number.
+  exit -3
+fi
+
+# guarantees the same sampling for roi mask and vector image
+roi_mask2=resampled_${roi_mask}
+clitkResampleImage -i ${roi_mask} -o ${roi_mask2} --like ${rtstruct_ref_image}
+
+# calculate stats
+clitkImageStatistics -i ${rtstruct_ref_image} -m ${roi_mask2} --verbose 2> /dev/null | tail -n 8 > /tmp/result.txt
+
+if [ $gui_mode = 1 ]; then
+  cat /tmp/result.txt | zenity --text-info --title "Restuls for \"${rtstruct_roi_name}\""
+else
+  echo "Restuls for \"${rtstruct_roi_name}\""
+  cat /tmp/result.txt 
+fi
+
+rm `basename $roi_mask .mhd`.{mhd,raw}
+rm `basename $roi_mask2 .mhd`.{mhd,raw}
+rm /tmp/err.txt
+rm /tmp/result.txt
index 8eeb3fc3b8b6365fb1bf348905d2514b241e33e4..131ff8e25bd101b351ea6c49a284bbeb06ee842a 100644 (file)
@@ -17,6 +17,8 @@ option "size"         -       "New output size if different from input"       int     no      multiple
 option "spacing"       -       "New output spacing if different from input"    double  no      multiple
 option "origin"                -       "New output origin if different from input"     double  no      multiple
 option "matrix"                m       "Affine matrix (homogene) filename"             string  no
+option "rotate"                r       "Rotation to apply (radians)"                   double  no      multiple
+option "translate"     t       "Translation to apply (mm)"                     double  no      multiple
 option "pad"           -       "Edge padding value"                            double  no      default="0.0"
 
 section "Interpolation"
index ef81fe2d464bc7082ed42a8f2d9ae1d5856ea3dc..ec9db098493cb873f1f0d4478696b48da1e5b0f6 100644 (file)
@@ -135,16 +135,50 @@ AffineTransformGenericFilter<args_info_type>::UpdateWithDimAndPixelType()
 
   // Matrix
   typename itk::Matrix<double, Dimension+1, Dimension+1> matrix;
-  if (m_ArgsInfo.matrix_given) {
-    matrix= clitk::ReadMatrix<Dimension>(m_ArgsInfo.matrix_arg);
-    if (m_Verbose) std::cout<<"Reading the matrix..."<<std::endl;
-  } else {
-    matrix.SetIdentity();
+  if (m_ArgsInfo.rotate_given || m_ArgsInfo.translate_given)
+  {
+    if (m_ArgsInfo.matrix_given)
+    {
+      std::cerr << "You must use either rotate/translate or matrix options" << std::cout;
+      return;
+    }
+    itk::Array<double> transformParameters(2 * Dimension);
+    int pos = 0;
+    if (Dimension == 2)
+      transformParameters[pos++] = m_ArgsInfo.rotate_arg[0];
+    else
+      for (unsigned int i = 0; i < 3; i++)
+        transformParameters[pos++] = m_ArgsInfo.rotate_arg[i];
+    for (unsigned int i = 0; i < Dimension && i < 3; i++)
+      transformParameters[pos++] = m_ArgsInfo.translate_arg[i];
+    if (Dimension == 4)
+    {
+      matrix.SetIdentity();
+      itk::Matrix<double, 4, 4> tmp = GetForwardAffineMatrix3D(transformParameters);
+      for (unsigned int i = 0; i < 3; ++i)
+        for (unsigned int j = 0; j < 3; ++j)
+          matrix[i][j] = tmp[i][j];
+      for (unsigned int i = 0; i < 3; ++i)
+        matrix[i][4] = tmp[i][3];
+    }
+    else
+      matrix = GetForwardAffineMatrix<Dimension>(transformParameters);
+  }
+  else
+  {
+    if (m_ArgsInfo.matrix_given)
+    {
+      matrix= clitk::ReadMatrix<Dimension>(m_ArgsInfo.matrix_arg);
+      if (m_Verbose) std::cout << "Reading the matrix..." << std::endl;
+    }
+    else
+      matrix.SetIdentity();
   }
-  if (m_Verbose) std::cout<<"Using the following matrix:"<<std::endl;
-  if (m_Verbose) std::cout<<matrix<<std::endl;
-  typename itk::Matrix<double, Dimension, Dimension> rotationMatrix=clitk::GetRotationalPartMatrix(matrix);
-  typename itk::Vector<double,Dimension> translationPart= clitk::GetTranslationPartMatrix(matrix);
+  if (m_Verbose)
+    std::cout << "Using the following matrix:" << std::endl
+              << matrix << std::endl;
+  typename itk::Matrix<double, Dimension, Dimension> rotationMatrix = clitk::GetRotationalPartMatrix(matrix);
+  typename itk::Vector<double, Dimension> translationPart = clitk::GetTranslationPartMatrix(matrix);
 
   // Transform
   typedef itk::AffineTransform<double, Dimension> AffineTransformType;
@@ -284,14 +318,50 @@ void AffineTransformGenericFilter<args_info_type>::UpdateWithDimAndVectorType()
 
   // Matrix
   typename itk::Matrix<double, Dimension+1, Dimension+1> matrix;
-  if (m_ArgsInfo.matrix_given)
-    matrix= clitk::ReadMatrix<Dimension>(m_ArgsInfo.matrix_arg);
+  if (m_ArgsInfo.rotate_given || m_ArgsInfo.translate_given)
+  {
+    if (m_ArgsInfo.matrix_given)
+    {
+      std::cerr << "You must use either rotate/translate or matrix options" << std::cout;
+      return;
+    }
+    itk::Array<double> transformParameters(2 * Dimension);
+    int pos = 0;
+    if (Dimension == 2)
+      transformParameters[pos++] = m_ArgsInfo.rotate_arg[0];
+    else
+      for (unsigned int i = 0; i < 3; i++)
+        transformParameters[pos++] = m_ArgsInfo.rotate_arg[i];
+    for (unsigned int i = 0; i < Dimension && i < 3; i++)
+      transformParameters[pos++] = m_ArgsInfo.translate_arg[i];
+    if (Dimension == 4)
+    {
+      matrix.SetIdentity();
+      itk::Matrix<double, 4, 4> tmp = GetForwardAffineMatrix3D(transformParameters);
+      for (unsigned int i = 0; i < 3; ++i)
+        for (unsigned int j = 0; j < 3; ++j)
+          matrix[i][j] = tmp[i][j];
+      for (unsigned int i = 0; i < 3; ++i)
+        matrix[i][4] = tmp[i][3];
+    }
+    else
+      matrix = GetForwardAffineMatrix<Dimension>(transformParameters);
+  }
   else
-    matrix.SetIdentity();
-  if (m_Verbose) std::cout<<"Using the following matrix:"<<std::endl;
-  if (m_Verbose) std::cout<<matrix<<std::endl;
-  typename itk::Matrix<double, Dimension, Dimension> rotationMatrix=clitk::GetRotationalPartMatrix(matrix);
-  typename itk::Vector<double, Dimension> translationPart= clitk::GetTranslationPartMatrix(matrix);
+  {
+    if (m_ArgsInfo.matrix_given)
+    {
+      matrix= clitk::ReadMatrix<Dimension>(m_ArgsInfo.matrix_arg);
+      if (m_Verbose) std::cout << "Reading the matrix..." << std::endl;
+    }
+    else
+      matrix.SetIdentity();
+  }
+  if (m_Verbose)
+    std::cout << "Using the following matrix:" << std::endl
+              << matrix << std::endl;
+  typename itk::Matrix<double, Dimension, Dimension> rotationMatrix = clitk::GetRotationalPartMatrix(matrix);
+  typename itk::Vector<double, Dimension> translationPart = clitk::GetTranslationPartMatrix(matrix);
 
   // Transform
   typedef itk::AffineTransform<double, Dimension> AffineTransformType;
index d2a6ba71a24b842dae55db5ad2f6baaf09ee1dc7..714d3d97568743c8bd7e8313bb31249fafe24f54 100644 (file)
@@ -1241,8 +1241,14 @@ double vvSlicer::GetScalarComponentAsDouble(vtkImageData *image, double X, doubl
 //----------------------------------------------------------------------------
 void vvSlicer::Render()
 {
-  if (this->GetWindowLevel()->GetLookupTable() && !this->mOverlay && !this->mFusion) {
+  if (this->mFusion) {
+    legend->SetLookupTable(this->GetFusionMapper()->GetLookupTable());
+    legend->UseOpacityOn();
+    legend->SetVisibility(1);
+  }
+  else if (this->GetWindowLevel()->GetLookupTable()) {// && !this->mOverlay && !this->mFusion) {
     legend->SetLookupTable(this->GetWindowLevel()->GetLookupTable());
+    legend->UseOpacityOff();
     legend->SetVisibility(1);
   } else legend->SetVisibility(0);
 
index d9ed42e2deb448f541eaf97993db3f0eb6b1c483..2373abab970f69a17df88871a0051470ebe371a9 100644 (file)
@@ -1236,15 +1236,17 @@ void vvSlicerManager::SetColorMap(int colormap)
     double v[4];
     
     // set color table transparency
+    double alpha_range=(double)mFusionThresOpacity/10;
     double range_end = frange[0] + (double)mFusionThresOpacity*(frange[1] - frange[0])/100;
-    double curr_value = frange[0];
+    double curr_value = fusRange[0];
     int nvalues = fusLUT->GetNumberOfTableValues();
-    //for (double i = frange[0]; i <= alpha_range_end; i++) {
     for (double i = 0; curr_value < range_end; i++) {  
       fusLUT->GetTableValue(i, v);
       v[3] = 0;
+      //if (curr_value >= -alpha_range && curr_value <= alpha_range) v[3] = pow(fabs(curr_value/alpha_range),2);
+      //else v[3] = 1;
       fusLUT->SetTableValue(i, v);
-      curr_value += (frange[1] - frange[0])/nvalues;
+      curr_value += (fusRange[1] - fusRange[0])/nvalues;
     }
   }
   for ( unsigned int i = 0; i < mSlicers.size(); i++) {