VolumeBase* MultiVolumeReader::read(const VolumeURL& origin) throw (tgt::FileException, std::bad_alloc) { std::string path = extractPurePathFromFileName(origin.getPath()); std::string refFile = origin.getSearchParameter("file"); if (refFile == "") throw tgt::FileException("'file' parameter missing in URL", origin.getURL()); VolumeURL refOrigin(path + refFile); LINFO("Loading file " + refOrigin.getPath()); VolumeBase* handle = 0; if (populator_) handle = populator_->getVolumeSerializer()->read(refOrigin); else { VolumeSerializerPopulator populator; handle = populator.getVolumeSerializer()->read(refOrigin); } if (handle) handle->setOrigin(origin); return handle; }
// ------------------------------------------------------------------------ void NormaliseImage(const ImageType::Pointer &input, const ImageType::Pointer &reference, ImageType::Pointer &output, SeriesTransform &trans) { // flip the x and y axis typedef itk::PermuteAxesImageFilter<ImageType> FlipperType; FlipperType::Pointer flipper = FlipperType::New(); itk::FixedArray<unsigned int, 3> order; order[0] = 1; order[1] = 0; order[2] = 2; flipper->SetOrder(order); flipper->SetInput(input); flipper->Update(); output = flipper->GetOutput(); // get the reference offset vnl_vector<double> refOrigin(3); refOrigin[0] = reference->GetOrigin()[0];// + trans.translation[0]; refOrigin[1] = reference->GetOrigin()[1];// + trans.translation[1]; refOrigin[2] = reference->GetOrigin()[2];// + trans.translation[2]; vnl_matrix<double> refRot = reference->GetDirection().GetVnlMatrix(); vnl_matrix<double> refRotInv = vnl_inverse(refRot); vnl_vector<double> refOffset = refRotInv * refOrigin; // get the image origin vnl_vector<double> origin(3); origin[0] = output->GetOrigin()[0]; origin[1] = output->GetOrigin()[1]; origin[2] = output->GetOrigin()[2]; // apply the rotation to the origin origin = refRotInv * origin; // apply the offset to the origin origin = origin - refOffset; // apply the scaling origin /= reference->GetSpacing()[0]; // put the values into the output image ImageType::PointType itkOrigin; itkOrigin[0] = origin[0]; itkOrigin[1] = origin[1]; itkOrigin[2] = origin[2]; ImageType::SpacingType spacing; spacing.Fill(output->GetSpacing()[0] / reference->GetSpacing()[0]); // get the new direction ImageType::DirectionType dirOut = output->GetDirection(); dirOut = reference->GetDirection().GetInverse() * dirOut.GetVnlMatrix(); output->SetSpacing(spacing); output->SetDirection(dirOut); output->SetOrigin(itkOrigin); }