18 TissueGeneratorParameters::Pointer parameters)
22 const double RESAMPLING_FACTOR = 2;
24 if (parameters->GetDoPartialVolume())
26 parameters->SetXDim(parameters->GetXDim() * RESAMPLING_FACTOR);
27 parameters->SetYDim(parameters->GetYDim() * RESAMPLING_FACTOR);
28 parameters->SetZDim(parameters->GetZDim() * RESAMPLING_FACTOR);
29 parameters->SetVesselBifurcationFrequency(parameters->GetVesselBifurcationFrequency() * RESAMPLING_FACTOR);
30 parameters->SetVoxelSpacingInCentimeters(parameters->GetVoxelSpacingInCentimeters() / RESAMPLING_FACTOR);
33 parameters->SetVesselBifurcationFrequency(10000);
35 std::mt19937 randomNumberGenerator;
36 std::random_device randomDevice;
37 if (parameters->GetUseRngSeed())
39 randomNumberGenerator.seed(parameters->GetRngSeed());
43 if (randomDevice.entropy() > 0.1)
45 randomNumberGenerator.seed(randomDevice());
49 randomNumberGenerator.seed(std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now().time_since_epoch()).count());
55 const unsigned int NUMER_OF_VESSELS = 5;
56 const double START_DEPTH_IN_CM = 2.10;
57 const double START_X_IN_CM = 0.76;
58 const double RADIUS_IN_MM = 0.5;
59 const double INCREMENT_XZ_IN_CM = 0.50;
60 double ABSORPTION_PER_CM = parameters->GetMinVesselAbsorption();
62 generatedVolume->AddIntProperty(
"numberOfVessels", NUMER_OF_VESSELS);
63 generatedVolume->AddIntProperty(
"bifurcationFrequency", parameters->GetVesselBifurcationFrequency());
65 for (
unsigned int vesselNumber = 0; vesselNumber < NUMER_OF_VESSELS; vesselNumber++)
70 double initialRadius = RADIUS_IN_MM / parameters->GetVoxelSpacingInCentimeters() / 10;
71 std::stringstream radiusString;
72 radiusString <<
"vessel_" << vesselNumber + 1 <<
"_radius";
73 generatedVolume->AddDoubleProperty(radiusString.str(), initialRadius);
75 double absorptionCoefficient = ABSORPTION_PER_CM;
76 std::stringstream absorptionString;
77 absorptionString <<
"vessel_" << vesselNumber + 1 <<
"_absorption";
78 generatedVolume->AddDoubleProperty(absorptionString.str(), absorptionCoefficient);
80 double bendingFactor = 0;
81 std::stringstream bendingString;
82 bendingString <<
"vessel_" << vesselNumber + 1 <<
"_bendingFactor";
83 generatedVolume->AddDoubleProperty(bendingString.str(), bendingFactor);
85 double vesselScattering = 15;
86 std::stringstream scatteringString;
87 scatteringString <<
"vessel_" << vesselNumber + 1 <<
"_scattering";
88 generatedVolume->AddDoubleProperty(scatteringString.str(), vesselScattering);
90 double vesselAnisotropy = 0.9;
91 std::stringstream anisotropyString;
92 anisotropyString <<
"vessel_" << vesselNumber + 1 <<
"_anisotropy";
93 generatedVolume->AddDoubleProperty(anisotropyString.str(), vesselAnisotropy);
103 double zposition = (START_DEPTH_IN_CM + (vesselNumber*INCREMENT_XZ_IN_CM)) / parameters->GetVoxelSpacingInCentimeters();
105 double xposition = (START_X_IN_CM + (vesselNumber*INCREMENT_XZ_IN_CM)) / parameters->GetVoxelSpacingInCentimeters();
107 initialPosition->Randomize(xposition, xposition, 0, 0, zposition, zposition, &randomNumberGenerator);
108 initialDirection->Randomize(0, 0, 1, 1, 0, 0, &randomNumberGenerator);
110 initialDirection->Normalize();
111 MITK_INFO << initialPosition->GetElement(0) <<
" | " << initialPosition->GetElement(1) <<
" | " << initialPosition->GetElement(2);
112 MITK_INFO << initialDirection->GetElement(0) <<
" | " << initialDirection->GetElement(1) <<
" | " << initialDirection->GetElement(2);
115 vesselParams->SetDirectionVector(initialDirection);
116 vesselParams->SetPositionVector(initialPosition);
117 vesselParams->SetRadiusInVoxel(initialRadius);
118 vesselParams->SetAbsorptionCoefficient(absorptionCoefficient);
119 vesselParams->SetScatteringCoefficient(vesselScattering);
120 vesselParams->SetAnisotopyCoefficient(vesselAnisotropy);
121 vesselParams->SetBifurcationFrequency(parameters->GetVesselBifurcationFrequency());
122 vesselParams->SetDoPartialVolume(parameters->GetDoPartialVolume());
124 VesselTree::Pointer vesselTree = VesselTree::New(vesselParams);
126 while (!vesselTree->IsFinished())
128 vesselTree->Step(generatedVolume, parameters->GetCalculateNewVesselPositionCallback(), bendingFactor, &randomNumberGenerator);
132 if (parameters->GetDoPartialVolume())
135 parameters->SetXDim(parameters->GetXDim() / RESAMPLING_FACTOR);
136 parameters->SetYDim(parameters->GetYDim() / RESAMPLING_FACTOR);
137 parameters->SetZDim(parameters->GetZDim() / RESAMPLING_FACTOR);
138 parameters->SetVesselBifurcationFrequency(parameters->GetVesselBifurcationFrequency() / RESAMPLING_FACTOR);
139 parameters->SetVoxelSpacingInCentimeters(parameters->GetVoxelSpacingInCentimeters() * RESAMPLING_FACTOR);
142 generatedVolume->FinalizeVolume();
144 return generatedVolume;
147 mitk::pa::PhantomTissueGenerator::PhantomTissueGenerator()
151 mitk::pa::PhantomTissueGenerator::~PhantomTissueGenerator()
static InSilicoTissueVolume::Pointer GeneratePhantomData(TissueGeneratorParameters::Pointer parameters)
GenerateInSilicoData This method will return a InSilicoTissueVolume created in terms of the given par...
static InSilicoTissueVolume::Pointer New(mitk::pa::Volume::Pointer absorptionVolume, Volume::Pointer scatteringVolume, Volume::Pointer anisotropyVolume, Volume::Pointer segmentationVolume, TissueGeneratorParameters::Pointer tissueParameters, mitk::PropertyList::Pointer propertyList)
static void RescaleImage(InSilicoTissueVolume::Pointer image, double ratio)