X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=common%2FclitkDicomRTStruct2ImageFilter.cxx;h=2e11fdc42a6ccd2a3243d8f6598b74c52cddd534;hb=d786b4f836c0f12ba4a6dd06803cbe771ac371e3;hp=ad90bef4d56220dfff44e3f7dda190c75a0f9e87;hpb=35620b6e7b940cbeea17a58411e2dbba04484b17;p=clitk.git diff --git a/common/clitkDicomRTStruct2ImageFilter.cxx b/common/clitkDicomRTStruct2ImageFilter.cxx index ad90bef..2e11fdc 100644 --- a/common/clitkDicomRTStruct2ImageFilter.cxx +++ b/common/clitkDicomRTStruct2ImageFilter.cxx @@ -25,11 +25,13 @@ #include "clitkImageCommon.h" // vtk +#include #include #include #include #include #include +#include //-------------------------------------------------------------------- @@ -37,6 +39,7 @@ clitk::DicomRTStruct2ImageFilter::DicomRTStruct2ImageFilter() { mROI = NULL; mWriteOutput = false; + mWriteMesh = false; mCropMask = true; } //-------------------------------------------------------------------- @@ -82,6 +85,14 @@ void clitk::DicomRTStruct2ImageFilter::SetCropMaskEnabled(bool b) //-------------------------------------------------------------------- +//-------------------------------------------------------------------- +void clitk::DicomRTStruct2ImageFilter::SetWriteMesh(bool b) +{ + mWriteMesh = b; +} +//-------------------------------------------------------------------- + + //-------------------------------------------------------------------- void clitk::DicomRTStruct2ImageFilter::SetOutputImageFilename(std::string s) { @@ -101,10 +112,15 @@ void clitk::DicomRTStruct2ImageFilter::SetImage(vvImage::Pointer image) mSpacing.resize(3); mOrigin.resize(3); mSize.resize(3); + mDirection.resize(3); + mTransformMatrix = image->GetTransform()[0]->GetMatrix(); for(unsigned int i=0; i<3; i++) { mSpacing[i] = image->GetSpacing()[i]; mOrigin[i] = image->GetOrigin()[i]; mSize[i] = image->GetSize()[i]; + mDirection[i].resize(3); + for(unsigned int j=0; j<3; j++) + mDirection[i][j] = image->GetDirection()[i][j]; } } //-------------------------------------------------------------------- @@ -124,10 +140,14 @@ void clitk::DicomRTStruct2ImageFilter::SetImageFilename(std::string f) mSpacing.resize(3); mOrigin.resize(3); mSize.resize(3); + mDirection.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); + mDirection[i].resize(3); + for(unsigned int j=0; j<3; j++) + mDirection[i][j] = header->GetDirection(i)[j]; } } //-------------------------------------------------------------------- @@ -170,11 +190,55 @@ void clitk::DicomRTStruct2ImageFilter::Update() } // Get Mesh - vtkPolyData * mesh = mROI->GetMesh(); + vtkPolyData * mesh = mROI->GetMesh(); + if (mWriteMesh) { + vtkSmartPointer meshWriter = vtkSmartPointer::New(); + std::string vtkName = mOutputFilename; + vtkName += ".vtk"; + meshWriter->SetFileName(vtkName.c_str()); +#if VTK_MAJOR_VERSION <= 5 + meshWriter->SetInput(mesh); +#else + meshWriter->SetInputData(mesh); +#endif + meshWriter->Write(); + } // Get bounds double *bounds=mesh->GetBounds(); + //Change mOrigin, mSize and mSpacing with respect to the directions + // Spacing is influenced by input direction + std::vector tempSpacing; + tempSpacing.resize(3); + for(int i=0; i<3; i++) { + tempSpacing[i] = 0.0; + for(int j=0; j<3; j++) { + tempSpacing[i] += mDirection[i][j] * mSpacing[j]; + } + } + for(int i=0; i<3; i++) + mSpacing[i] = tempSpacing[i]; + + // Size is influenced by affine transform matrix and input direction + // Size is converted to double, transformed and converted back to size type. + std::vector tempSize; + tempSize.resize(3); + for(int i=0; i<3; i++) { + tempSize[i] = 0.0; + for(int j=0; j<3; j++) { + tempSize[i] += mDirection[i][j] * mSize[j]; + } + } + for(int i=0; i<3; i++) { + if (tempSize[i] < 0.0) { + tempSize[i] *= -1; + mOrigin[i] += mSpacing[i]*(tempSize[i] -1); + mSpacing[i] *= -1; + } + mSize[i] = lrint(tempSize[i]); + } + // Compute origin std::vector origin; origin.resize(3); @@ -188,7 +252,6 @@ void clitk::DicomRTStruct2ImageFilter::Update() 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++) { @@ -199,20 +262,30 @@ void clitk::DicomRTStruct2ImageFilter::Update() // Create new output image mBinaryImage = vtkSmartPointer::New(); +#if VTK_MAJOR_VERSION <= 5 mBinaryImage->SetScalarTypeToUnsignedChar(); +#endif mBinaryImage->SetOrigin(&origin[0]); mBinaryImage->SetSpacing(&mSpacing[0]); mBinaryImage->SetExtent(0, extend[0], 0, extend[1], 0, extend[2]); +#if VTK_MAJOR_VERSION <= 5 mBinaryImage->AllocateScalars(); +#else + mBinaryImage->AllocateScalars(VTK_UNSIGNED_CHAR, 1); +#endif memset(mBinaryImage->GetScalarPointer(), 0, mBinaryImage->GetDimensions()[0]*mBinaryImage->GetDimensions()[1]*mBinaryImage->GetDimensions()[2]*sizeof(unsigned char)); // Extrude vtkSmartPointer extrude=vtkSmartPointer::New(); +#if VTK_MAJOR_VERSION <= 5 extrude->SetInput(mesh); +#else + extrude->SetInputData(mesh); +#endif ///We extrude in the -slice_spacing direction to respect the FOCAL convention (NEEDED !) extrude->SetVector(0, 0, -mSpacing[2]); @@ -222,12 +295,24 @@ void clitk::DicomRTStruct2ImageFilter::Update() //http://www.nabble.com/Bug-in-vtkPolyDataToImageStencil--td23368312.html#a23370933 sts->SetTolerance(0); sts->SetInformationInput(mBinaryImage); +#if VTK_MAJOR_VERSION <= 5 sts->SetInput(extrude->GetOutput()); +#else + sts->SetInputConnection(extrude->GetOutputPort(0)); +#endif //sts->SetInput(mesh); vtkSmartPointer stencil=vtkSmartPointer::New(); +#if VTK_MAJOR_VERSION <= 5 stencil->SetStencil(sts->GetOutput()); +#else + stencil->SetStencilConnection(sts->GetOutputPort(0)); +#endif +#if VTK_MAJOR_VERSION <= 5 stencil->SetInput(mBinaryImage); +#else + stencil->SetInputData(mBinaryImage); +#endif stencil->ReverseStencilOn(); stencil->Update();