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 std::mt19937 randomNumberGenerator;
34 std::random_device randomDevice;
35 if (parameters->GetUseRngSeed())
37 randomNumberGenerator.seed(parameters->GetRngSeed());
41 if (randomDevice.entropy() > 0.1)
43 randomNumberGenerator.seed(randomDevice());
47 randomNumberGenerator.seed(std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now().time_since_epoch()).count());
53 double DIRECTION_VECTOR_INITIAL_VARIANCE = 0.2;
55 if(parameters->GetForceVesselsMoveAlongYDirection())
56 DIRECTION_VECTOR_INITIAL_VARIANCE = 0;
58 std::uniform_int_distribution<int> randomNumVesselDistribution(
59 parameters->GetMinNumberOfVessels(), parameters->GetMaxNumberOfVessels());
60 std::uniform_real_distribution<double> randomBendingDistribution(
61 parameters->GetMinVesselBending(), parameters->GetMaxVesselBending());
62 std::uniform_real_distribution<double> randomAbsorptionDistribution(
63 parameters->GetMinVesselAbsorption(), parameters->GetMaxVesselAbsorption());
64 std::uniform_real_distribution<double> randomRadiusDistribution(
65 parameters->GetMinVesselRadiusInMillimeters(), parameters->GetMaxVesselRadiusInMillimeters());
66 std::uniform_real_distribution<double> randomScatteringDistribution(
67 parameters->GetMinVesselScattering(), parameters->GetMaxVesselScattering());
68 std::uniform_real_distribution<double> randomAnisotropyDistribution(
69 parameters->GetMinVesselAnisotropy(), parameters->GetMaxVesselAnisotropy());
70 std::uniform_int_distribution<int> borderTypeDistribution(0, 3);
72 int numberOfBloodVessels = randomNumVesselDistribution(randomNumberGenerator);
74 generatedVolume->AddIntProperty(
"numberOfVessels", numberOfBloodVessels);
75 generatedVolume->AddIntProperty(
"bifurcationFrequency", parameters->GetVesselBifurcationFrequency());
77 MITK_INFO <<
"Simulating " << numberOfBloodVessels <<
" vessel structures";
78 for (
int vesselNumber = 0; vesselNumber < numberOfBloodVessels; vesselNumber++)
83 double initialRadius = randomRadiusDistribution(randomNumberGenerator) / parameters->GetVoxelSpacingInCentimeters() / 10;
84 std::stringstream radiusString;
85 radiusString <<
"vessel_" << vesselNumber + 1 <<
"_radius";
86 generatedVolume->AddDoubleProperty(radiusString.str(), initialRadius);
88 double absorptionCoefficient = randomAbsorptionDistribution(randomNumberGenerator);
89 std::stringstream absorptionString;
90 absorptionString <<
"vessel_" << vesselNumber + 1 <<
"_absorption";
91 generatedVolume->AddDoubleProperty(absorptionString.str(), absorptionCoefficient);
93 double bendingFactor = randomBendingDistribution(randomNumberGenerator);
94 std::stringstream bendingString;
95 bendingString <<
"vessel_" << vesselNumber + 1 <<
"_bendingFactor";
96 generatedVolume->AddDoubleProperty(bendingString.str(), bendingFactor);
98 double vesselScattering = randomScatteringDistribution(randomNumberGenerator);
99 std::stringstream scatteringString;
100 scatteringString <<
"vessel_" << vesselNumber + 1 <<
"_scattering";
101 generatedVolume->AddDoubleProperty(scatteringString.str(), vesselScattering);
103 double vesselAnisotropy = randomAnisotropyDistribution(randomNumberGenerator);
104 std::stringstream anisotropyString;
105 anisotropyString <<
"vessel_" << vesselNumber + 1 <<
"_anisotropy";
106 generatedVolume->AddDoubleProperty(anisotropyString.str(), vesselAnisotropy);
115 int borderType = borderTypeDistribution(randomNumberGenerator);
117 if(parameters->GetForceVesselsMoveAlongYDirection())
123 initialPosition->Randomize(0, 0, initialRadius, parameters->GetYDim() - initialRadius,
124 parameters->GetMinVesselZOrigin() / parameters->GetVoxelSpacingInCentimeters(),
125 parameters->GetMaxVesselZOrigin() / parameters->GetVoxelSpacingInCentimeters(), &randomNumberGenerator);
126 initialDirection->Randomize(1, 2, -DIRECTION_VECTOR_INITIAL_VARIANCE, DIRECTION_VECTOR_INITIAL_VARIANCE,
127 -DIRECTION_VECTOR_INITIAL_VARIANCE, DIRECTION_VECTOR_INITIAL_VARIANCE, &randomNumberGenerator);
130 initialPosition->Randomize(parameters->GetXDim() - 1, parameters->GetXDim() - 1, initialRadius, parameters->GetYDim() - initialRadius,
131 parameters->GetMinVesselZOrigin() / parameters->GetVoxelSpacingInCentimeters(),
132 parameters->GetMaxVesselZOrigin() / parameters->GetVoxelSpacingInCentimeters(), &randomNumberGenerator);
133 initialDirection->Randomize(-2, -1, -DIRECTION_VECTOR_INITIAL_VARIANCE, DIRECTION_VECTOR_INITIAL_VARIANCE,
134 -DIRECTION_VECTOR_INITIAL_VARIANCE, DIRECTION_VECTOR_INITIAL_VARIANCE, &randomNumberGenerator);
137 initialPosition->Randomize(initialRadius, parameters->GetXDim() - initialRadius, 0, 0,
138 parameters->GetMinVesselZOrigin() / parameters->GetVoxelSpacingInCentimeters(),
139 parameters->GetMaxVesselZOrigin() / parameters->GetVoxelSpacingInCentimeters(), &randomNumberGenerator);
140 initialDirection->Randomize(-DIRECTION_VECTOR_INITIAL_VARIANCE, DIRECTION_VECTOR_INITIAL_VARIANCE, 1, 2,
141 -DIRECTION_VECTOR_INITIAL_VARIANCE, DIRECTION_VECTOR_INITIAL_VARIANCE, &randomNumberGenerator);
144 initialPosition->Randomize(initialRadius, parameters->GetXDim() - initialRadius, parameters->GetYDim() - 1, parameters->GetYDim() - 1,
145 parameters->GetMinVesselZOrigin() / parameters->GetVoxelSpacingInCentimeters(),
146 parameters->GetMaxVesselZOrigin() / parameters->GetVoxelSpacingInCentimeters(), &randomNumberGenerator);
147 initialDirection->Randomize(-DIRECTION_VECTOR_INITIAL_VARIANCE, DIRECTION_VECTOR_INITIAL_VARIANCE, -2, -1,
148 -DIRECTION_VECTOR_INITIAL_VARIANCE, DIRECTION_VECTOR_INITIAL_VARIANCE, &randomNumberGenerator);
152 initialDirection->Normalize();
153 MITK_INFO << initialPosition->GetElement(0) <<
" | " << initialPosition->GetElement(1) <<
" | " << initialPosition->GetElement(2);
154 MITK_INFO << initialDirection->GetElement(0) <<
" | " << initialDirection->GetElement(1) <<
" | " << initialDirection->GetElement(2);
157 vesselParams->SetDirectionVector(initialDirection);
158 vesselParams->SetPositionVector(initialPosition);
159 vesselParams->SetRadiusInVoxel(initialRadius);
160 vesselParams->SetAbsorptionCoefficient(absorptionCoefficient);
161 vesselParams->SetScatteringCoefficient(vesselScattering);
162 vesselParams->SetAnisotopyCoefficient(vesselAnisotropy);
163 vesselParams->SetBifurcationFrequency(parameters->GetVesselBifurcationFrequency());
164 vesselParams->SetDoPartialVolume(parameters->GetDoPartialVolume());
166 VesselTree::Pointer vesselTree = VesselTree::New(vesselParams);
168 while (!vesselTree->IsFinished())
170 vesselTree->Step(generatedVolume, parameters->GetCalculateNewVesselPositionCallback(), bendingFactor, &randomNumberGenerator);
174 if (parameters->GetDoPartialVolume())
177 parameters->SetXDim(parameters->GetXDim() / RESAMPLING_FACTOR);
178 parameters->SetYDim(parameters->GetYDim() / RESAMPLING_FACTOR);
179 parameters->SetZDim(parameters->GetZDim() / RESAMPLING_FACTOR);
180 parameters->SetVesselBifurcationFrequency(parameters->GetVesselBifurcationFrequency() / RESAMPLING_FACTOR);
181 parameters->SetVoxelSpacingInCentimeters(parameters->GetVoxelSpacingInCentimeters() * RESAMPLING_FACTOR);
184 generatedVolume->FinalizeVolume();
186 return generatedVolume;
189 mitk::pa::InSilicoTissueGenerator::InSilicoTissueGenerator()
193 mitk::pa::InSilicoTissueGenerator::~InSilicoTissueGenerator()
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 InSilicoTissueVolume::Pointer GenerateInSilicoData(TissueGeneratorParameters::Pointer parameters)
GenerateInSilicoData This method will return a InSilicoTissueVolume created in terms of the given par...
static void RescaleImage(InSilicoTissueVolume::Pointer image, double ratio)