X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=tools%2FclitkDicomRT_ROI_ConvertToImageFilter.cxx;fp=tools%2FclitkDicomRT_ROI_ConvertToImageFilter.cxx;h=cedef817e23fcaa9beb8434765be2a99a91fd04d;hb=b7ecfab842d12fb1623660e74b859c609293beb3;hp=0000000000000000000000000000000000000000;hpb=8adbd489ccd1f941b1fd6e04c4c2c71b3e22efc6;p=clitk.git diff --git a/tools/clitkDicomRT_ROI_ConvertToImageFilter.cxx b/tools/clitkDicomRT_ROI_ConvertToImageFilter.cxx new file mode 100644 index 0000000..cedef81 --- /dev/null +++ b/tools/clitkDicomRT_ROI_ConvertToImageFilter.cxx @@ -0,0 +1,191 @@ +/*========================================================================= + Program: vv http://www.creatis.insa-lyon.fr/rio/vv + Main authors : XX XX XX + + Authors belongs to: + - University of LYON http://www.universite-lyon.fr/ + - Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr + - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr + + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the copyright notices for more information. + + It is distributed under dual licence + - BSD http://www.opensource.org/licenses/bsd-license.php + - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html + + =========================================================================*/ + +#include "clitkDicomRT_ROI_ConvertToImageFilter.h" +#include +#include +#include +#include +#include +#include "clitkImageCommon.h" + +//-------------------------------------------------------------------- +clitk::DicomRT_ROI_ConvertToImageFilter::DicomRT_ROI_ConvertToImageFilter() { + mROI = NULL; + mImageInfoIsSet = false; + mWriteOutput = false; + mCropMask = true; +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +clitk::DicomRT_ROI_ConvertToImageFilter::~DicomRT_ROI_ConvertToImageFilter() { + +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +void clitk::DicomRT_ROI_ConvertToImageFilter::SetROI(clitk::DicomRT_ROI * roi) { + mROI = roi; +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +void clitk::DicomRT_ROI_ConvertToImageFilter::SetCropMaskEnabled(bool b) { + mCropMask = b; +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +void clitk::DicomRT_ROI_ConvertToImageFilter::SetOutputImageFilename(std::string s) { + mOutputFilename = s; + mWriteOutput = true; +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +void clitk::DicomRT_ROI_ConvertToImageFilter::SetImageFilename(std::string f) { + itk::ImageIOBase::Pointer header = clitk::readImageHeader(f); + if (header->GetNumberOfDimensions() < 3) { + std::cerr << "Error. Please provide a 3D image instead of " << f << std::endl; + exit(0); + } + if (header->GetNumberOfDimensions() > 3) { + std::cerr << "Warning dimension > 3 are ignored" << std::endl; + } + mSpacing.resize(3); + mOrigin.resize(3); + mSize.resize(3); + for(unsigned int i=0; i<3; i++) { + mSpacing[i] = header->GetSpacing(i); + mOrigin[i] = header->GetOrigin(i); + mSize[i] = header->GetDimensions(i); + } + mImageInfoIsSet = true; +} +//-------------------------------------------------------------------- + + +//-------------------------------------------------------------------- +void clitk::DicomRT_ROI_ConvertToImageFilter::Update() { + if (!mROI) { + std::cerr << "Error. No ROI set, please use SetROI." << std::endl; + exit(0); + } + if (!mImageInfoIsSet) { + std::cerr << "Error. Please provide image info (spacing/origin) with SetImageFilename" << std::endl; + exit(0); + } + // DD("Update"); + + // Get Mesh + vtkPolyData * mesh = mROI->GetMesh(); + // DD(mesh->GetNumberOfCells()); + + // Get bounds + double *bounds=mesh->GetBounds(); + // for(int i=0; i<6; i++){ +// DD(bounds[i]); +// } + + // Compute origin + std::vector origin; + origin.resize(3); + origin[0] = floor((bounds[0]-mOrigin[0])/mSpacing[0]-2)*mSpacing[0]+mOrigin[0]; + origin[1] = floor((bounds[2]-mOrigin[1])/mSpacing[1]-2)*mSpacing[1]+mOrigin[1]; + origin[2] = floor((bounds[4]-mOrigin[2])/mSpacing[2]-2)*mSpacing[2]+mOrigin[2]; + + // Compute extend + std::vector extend; + extend.resize(3); + extend[0] = ceil((bounds[1]-origin[0])/mSpacing[0]+4); + extend[1] = ceil((bounds[3]-origin[1])/mSpacing[1]+4); + extend[2] = ceil((bounds[5]-origin[2])/mSpacing[2]+4); + + // If no crop, set initial image size/origin + if (!mCropMask) { + for(int i=0; i<3; i++) { + origin[i] = mOrigin[i]; + extend[i] = mSize[i]-1; + } + } + + // Create new output image + mBinaryImage = vtkImageData::New(); + mBinaryImage->SetScalarTypeToUnsignedChar(); + mBinaryImage->SetOrigin(&origin[0]); + mBinaryImage->SetSpacing(&mSpacing[0]); + mBinaryImage->SetExtent(0, extend[0], + 0, extend[1], + 0, extend[2]); + mBinaryImage->AllocateScalars(); + + // for(int i=0; i<3; i++){ + // DD(origin[i]); + // DD(extend[i]); + // DD(mBinaryImage->GetDimensions()[i]); + // } + memset(mBinaryImage->GetScalarPointer(), 0, + mBinaryImage->GetDimensions()[0]*mBinaryImage->GetDimensions()[1]*mBinaryImage->GetDimensions()[2]*sizeof(unsigned char)); + + // Extrude + vtkSmartPointer extrude=vtkSmartPointer::New(); + extrude->SetInput(mesh); + ///We extrude in the -slice_spacing direction to respect the FOCAL convention // ????????????? + extrude->SetVector(0, 0, -mSpacing[2]); + + // Binarization + vtkSmartPointer sts=vtkSmartPointer::New(); + //The following line is extremely important + //http://www.nabble.com/Bug-in-vtkPolyDataToImageStencil--td23368312.html#a23370933 + sts->SetTolerance(0); + sts->SetInformationInput(mBinaryImage); + sts->SetInput(extrude->GetOutput()); + //sts->SetInput(mesh); + + vtkSmartPointer stencil=vtkSmartPointer::New(); + stencil->SetStencil(sts->GetOutput()); + stencil->SetInput(mBinaryImage); + stencil->ReverseStencilOn(); + stencil->Update(); + mBinaryImage->ShallowCopy(stencil->GetOutput()); + + if (mWriteOutput) { + typedef itk::Image ImageType; + typedef itk::VTKImageToImageFilter ConnectorType; + ConnectorType::Pointer connector = ConnectorType::New(); + connector->SetInput(GetOutput()); + connector->Update(); + clitk::writeImage(connector->GetOutput(), mOutputFilename); + } +} +//-------------------------------------------------------------------- + + + +//-------------------------------------------------------------------- +vtkImageData * clitk::DicomRT_ROI_ConvertToImageFilter::GetOutput() { + return mBinaryImage; +} +//--------------------------------------------------------------------