121 cout <<
"The Markov Random Field (MRF) penalty is implemented for several types of neighborhood, potential functions," << endl;
122 cout <<
"similarity and proximity factors. All these parameters are described below, and a template configuration file" << endl;
123 cout <<
"for parameters selection can be found in the configuration folder (config/optimizer/MRF.conf). The configuration" << endl;
124 cout <<
"of this penalty can only be done through a configuration file. It is not possible to parameterize it directly" << endl;
125 cout <<
"from the command line. The MRF penalty has the following expression:" << endl;
126 cout <<
"penalty = beta * sum_on_voxels * sum_on_neighborhood * proximity_factor * similarity_factor * potential_function" << endl;
127 cout <<
"------------" << endl;
128 cout <<
"Neighborhood" << endl;
129 cout <<
"------------" << endl;
130 cout <<
"The neighborhood is set by the 'neighborhood shape' keyword and can be described using one of the following setting:" << endl;
131 cout <<
"[6-nearest]: Consider the 6 nearest neighbors, i.e. 2 along each dimension. In 2D, only 4 in the plane are used." << endl;
132 cout <<
"[box]: Consider all voxels included in a box centered on the voxel of interest. The size of the box is parameterized" << endl;
133 cout <<
" using the 'box neighborhood order' keyword. The side of the box is equal to '2*order+1'. The 8 corner voxels" << endl;
134 cout <<
" can also be excluded from the neighborhood by setting the 'exclude box neighborhood corners' keyword to 1." << endl;
135 cout <<
"[sphere]: Consider all voxels whose center is included in a sphere centered on the voxel of interest and of radius" << endl;
136 cout <<
" provided by the 'sphere neighborhood radius (mm)' keyword." << endl;
137 cout <<
"-----------------" << endl;
138 cout <<
"Proximity factors" << endl;
139 cout <<
"-----------------" << endl;
140 cout <<
"The proximity factors are used to weight the contribution of each neighbor to the global penalty, based on proximity to the" << endl;
141 cout <<
"voxel of interest. These factors are always normalized so that their sum is 1. They can be set using the 'proximity factor'" << endl;
142 cout <<
"keyword based on one of the following setting:" << endl;
143 cout <<
"[none]: Consider uniform proximity factors." << endl;
144 cout <<
"[voxel]: Consider factors inversely proportional to the distance in voxels from the voxel of interest (i.e. the unit" << endl;
145 cout <<
" is voxels, whatever the axis and the voxel dimensions)." << endl;
146 cout <<
"[euclidian]: Consider factors inversely proportional to the euclidian distance from the voxel of interest (i.e. the unit" << endl;
147 cout <<
" is mm)." << endl;
149 cout <<
"------------------" << endl;
150 cout <<
"Similarity factors" << endl;
151 cout <<
"------------------" << endl;
152 cout <<
"The similarity factors are used to weight the contribution of each neighbor to the global penalty, based on similarity to the" << endl;
153 cout <<
"voxel of interest. These factors are not normalized by default. They can be set using the 'similarity factor' keyword based on" << endl;
154 cout <<
"one of the following setting:" << endl;
155 cout <<
"[none]: Consider uniform similarity factors, i.e. the value of 1 for each voxel in the neighborhood." << endl;
156 cout <<
"[aBowsher]: Consider similarity factors based on the asymmetrical Bowsher's method and an additional image. The additional" << endl;
157 cout <<
" image must be provided using the '-multimodal' option in the command line. Based on additional image values," << endl;
158 cout <<
" voxels of the neighborhood most similar to the voxel of interest will have a similarity factor of 1, and the" << endl;
159 cout <<
" other voxels will have a similarity factor of 0. The number of most similar voxels is parameterized by a percentage" << endl;
160 cout <<
" of the number of voxels in the neighborhood, provided with the 'similarity threshold Bowsher (%)' keyword." << endl;
161 cout <<
" For an explanation of asymmetrical Bowsher, see Schramm et al, IEEE Trans. Med. Imaging, vol. 37, pp. 590, 2018." << endl;
162 cout <<
"-------------------" << endl;
163 cout <<
"Potential functions" << endl;
164 cout <<
"-------------------" << endl;
165 cout <<
"The potential function actually penalizes the difference between the voxel of interest and a neighbor. It can be set using the" << endl;
166 cout <<
"'potential function' keyword based on one of the following setting:" << endl;
167 cout <<
"[quadratic]: p(u,v) = 0.5*(u-v)^2" << endl;
168 cout <<
" Reference: Geman and Geman, IEEE Trans. Pattern Anal. Machine Intell., vol. PAMI-6, pp. 721-741, 1984." << endl;
169 cout <<
"[geman mcclure]: p(u,v,d) = (u-v)^2 / (d^2+(u-v)^2)" << endl;
170 cout <<
" The parameter 'd' can be set using the 'deltaGMC' keyword." << endl;
171 cout <<
" Reference: Geman and McClure, Proc. Amer. Statist. Assoc., 1985." << endl;
172 cout <<
"[hebert leahy]: p(u,v,m) = log(1+(u-v)^2/m^2)" << endl;
173 cout <<
" The parameter 'm' can be set using the 'muHL' keyword." << endl;
174 cout <<
" Reference: Hebert and Leahy, IEEE Trans. Med. Imaging, vol. 8, pp. 194-202, 1989." << endl;
175 cout <<
"[green logcosh]: p(u,v,d) = log(cosh((u-v)/d))" << endl;
176 cout <<
" The parameter 'd' can be set using the 'deltaLogCosh' keyword." << endl;
177 cout <<
" Reference: Green, IEEE Trans. Med. Imaging, vol. 9, pp. 84-93, 1990." << endl;
178 cout <<
"[huber piecewise]: " << endl;
179 cout <<
" p(u,v,d) = d*abs(u-v)-0.5*d^2 if abs(u-v) > d" << endl;
180 cout <<
" = 0.5*(u-v)^2 if abs(u-v) <= d" << endl;
181 cout <<
" The parameter 'd' can be set using the 'deltaHuber' keyword." << endl;
182 cout <<
" Reference: e.g. Mumcuoglu et al, Phys. Med. Biol., vol. 41, pp. 1777-1807, 1996." << endl;
183 cout <<
"[nuyts relative]: p(u,v,g) = (u-v)^2 / (u+v+g*abs(u-v))" << endl;
184 cout <<
" The parameter 'g' can be set using the 'gammaRD' keyword." << endl;
185 cout <<
" Reference: Nuyts et al, IEEE Trans. Nucl. Sci., vol. 49, pp. 56-60, 2002." << endl;
196 string key_word =
"";
201 key_word =
"neighborhood shape";
204 Cerr(
"***** iPenaltyMarkovRandomField::ReadConfigurationFile() -> Failed to get the '" << key_word <<
"' keyword !" << endl);
208 if (buffer ==
"sphere")
212 key_word =
"sphere neighborhood radius (mm)";
215 Cerr(
"***** iPenaltyMarkovRandomField::ReadConfigurationFile() -> Failed to get the '" << key_word <<
"' keyword !" << endl);
220 else if (buffer ==
"box")
224 key_word =
"box neighborhood order";
227 Cerr(
"***** iPenaltyMarkovRandomField::ReadConfigurationFile() -> Failed to get the '" << key_word <<
"' keyword !" << endl);
231 key_word =
"exclude box neighborhood corners";
234 Cerr(
"***** iPenaltyMarkovRandomField::ReadConfigurationFile() -> Failed to get the '" << key_word <<
"' keyword !" << endl);
239 else if (buffer ==
"6-nearest")
246 Cerr(
"***** iPenaltyMarkovRandomField::ReadConfigurationFile() -> Unknown neighborhood type '" << buffer <<
"' !" << endl);
253 key_word =
"proximity factor";
256 Cerr(
"***** iPenaltyMarkovRandomField::ReadConfigurationFile() -> Failed to get the '" << key_word <<
"' keyword !" << endl);
260 if (buffer ==
"euclidian")
265 else if (buffer ==
"voxel")
283 else if (buffer ==
"none")
290 Cerr(
"***** iPenaltyMarkovRandomField::ReadConfigurationFile() -> Unknown proximity factor type '" << buffer <<
"' !" << endl);
297 key_word =
"similarity factor";
300 Cerr(
"***** iPenaltyMarkovRandomField::ReadConfigurationFile() -> Failed to get the '" << key_word <<
"' keyword !" << endl);
304 if (buffer ==
"none")
309 else if (buffer ==
"aBowsher")
313 key_word =
"similarity threshold Bowsher (%)";
316 Cerr(
"***** iPenaltyMarkovRandomField::ReadConfigurationFile() -> Failed to get the '" << key_word <<
"' keyword !" << endl);
323 Cerr(
"***** iPenaltyMarkovRandomField::ReadConfigurationFile() -> Unknown similarity factor type '" << buffer <<
"' !" << endl);
330 key_word =
"potential function";
333 Cerr(
"***** iPenaltyMarkovRandomField::ReadConfigurationFile() -> Failed to get the '" << key_word <<
"' keyword !" << endl);
337 if (buffer ==
"quadratic")
343 else if (buffer ==
"nuyts relative")
347 key_word =
"gammaRD";
350 Cerr(
"***** iPenaltyMarkovRandomField::ReadConfigurationFile() -> Failed to get the '" << key_word <<
"' keyword !" << endl);
355 else if (buffer ==
"geman mcclure")
359 key_word =
"deltaGMC";
362 Cerr(
"***** iPenaltyMarkovRandomField::ReadConfigurationFile() -> Failed to get the '" << key_word <<
"' keyword !" << endl);
367 else if (buffer ==
"green logcosh")
371 key_word =
"deltaLogCosh";
374 Cerr(
"***** iPenaltyMarkovRandomField::ReadConfigurationFile() -> Failed to get the '" << key_word <<
"' keyword !" << endl);
379 else if (buffer ==
"hebert leahy")
386 Cerr(
"***** iPenaltyMarkovRandomField::ReadConfigurationFile() -> Failed to get the '" << key_word <<
"' keyword !" << endl);
391 else if (buffer ==
"huber piecewise")
395 key_word =
"deltaHuber";
398 Cerr(
"***** iPenaltyMarkovRandomField::ReadConfigurationFile() -> Failed to get the '" << key_word <<
"' keyword !" << endl);
405 Cerr(
"***** iPenaltyMarkovRandomField::ReadConfigurationFile() -> Unknown potential function '" << buffer <<
"' !" << endl);
421 Cerr(
"***** iPenaltyMarkovRandomField::ReadOptionsList() -> Options can be specified only using a configuration file !" << endl);
435 Cerr(
"***** iPenaltyMarkovRandomField::CheckSpecificParameters() -> Should provide a potential function type !" << endl);
441 Cerr(
"***** iPenaltyMarkovRandomField::CheckSpecificParameters() -> Should provide a proximity factor type !" << endl);
447 Cerr(
"***** iPenaltyMarkovRandomField::CheckSpecificParameters() -> Should provide a similarity factor type !" << endl);
453 Cerr(
"***** iPenaltyMarkovRandomField::CheckSpecificParameters() -> Should provide a neighborhood type !" << endl);
467 if (m_similarityBowsherThreshold<0. || m_similarityBowsherThreshold>100.)
469 Cerr(
"***** iPenaltyMarkovRandomField::CheckSpecificParameters() -> Provided threshold parameter for the Bowsher similarity " <<
m_similarityBowsherThreshold <<
" does not fall into [0,100]% !" << endl);
474 Cerr(
"***** iPenaltyMarkovRandomField::CheckSpecificParameters() -> Bowsher similarity requires a multimodal image !"<< endl);
479 Cout(
"***** iPenaltyMarkovRandomField::CheckSpecificParameters() -> Warning : More than one multimodal image, Bowsher similarity will use only the first one !"<< endl);
485 Cerr(
"***** iPenaltyMarkovRandomField::CheckSpecificParameters() -> Provided radius of the sphere neighborhood (" <<
m_neighborhoodSphereRadius <<
") is negative" << endl);
490 Cerr(
"***** iPenaltyMarkovRandomField::CheckSpecificParameters() -> Provided order of the box neighborhood (" <<
m_neighborhoodBoxOrder <<
") is negative" << endl);
496 Cerr(
"***** iPenaltyMarkovRandomField::CheckSpecificParameters() -> Provided gamma parameter of relative differences potential function must be positive or null !" << endl);
502 Cerr(
"***** iPenaltyMarkovRandomField::CheckSpecificParameters() -> Provided delta parameter of Geman and McClure's potential function must be strictly positive !" << endl);
508 Cerr(
"***** iPenaltyMarkovRandomField::CheckSpecificParameters() -> Provided delta parameter of Green's log-cosh potential function must be strictly positive !" << endl);
514 Cerr(
"***** iPenaltyMarkovRandomField::CheckSpecificParameters() -> Provided mu parameter of Hebert and Leahy's potential function must be strictly positive !" << endl);
520 Cerr(
"***** iPenaltyMarkovRandomField::CheckSpecificParameters() -> Provided delta parameter of Huber's piecewise potential function must be strictly positive !" << endl);
537 Cerr(
"***** iPenaltyMarkovRandomField::InitializeSpecific() -> Failed to build the neighborhood !" << endl);
543 Cerr(
"***** iPenaltyMarkovRandomField::InitializeSpecific() -> Failed to build the proximity factors !" << endl);
560 Cout(
"iPenaltyMarkovRandomField::InitializeSpecific() -> Use the MRF penalty" << endl);
566 Cout(
" --> shape of neighborhood: sphere" << endl);
571 Cout(
" --> shape of neighborhood: box" << endl);
577 Cout(
" --> shape of neighborhood: 6-nearest" << endl);
586 Cout(
" --> proximity factor: uniform" << endl);
590 Cout(
" --> proximity factor: inverse of euclidian distance" << endl);
594 Cout(
" --> proximity factor: inverse of voxel distance (i.e. distance in numbers of voxels)" << endl);
607 Cout(
" --> similarity factor: uniform" << endl);
611 Cout(
" --> similarity factor: asymmetric Bowsher" << endl);
621 Cout(
" --> potential function: quadratic" << endl);
625 Cout(
" --> potential function: Nuyts relative differences 2002" << endl);
630 Cout(
" --> potential function: Geman and McClure 1985" << endl);
635 Cout(
" --> potential function: Green log-cosh 1990" << endl);
640 Cout(
" --> potential function: Hebert and Leahy 1989" << endl);
645 Cout(
" --> potential function: Huber piecewise linear-quadratic" << endl);
664 Cerr(
"***** iPenaltyMarkovRandomField::BuildNeighborhoodKernel() -> Neighborhood kernel has already been created !" << endl);
688 INTNB nb_voxels_in_neighborhood = 0;
690 for (
INTNB vox_z = -radius_vox_z; vox_z<=radius_vox_z; vox_z++)
691 for (
INTNB vox_y = -radius_vox_y; vox_y<=radius_vox_y; vox_y++)
692 for (
INTNB vox_x = -radius_vox_x; vox_x<=radius_vox_x; vox_x++)
694 if (vox_x!=0 || vox_y!=0 || vox_z!=0)
697 FLTNB squareDistance = ((
FLTNB)(vox_x*vox_x))*vox_size_x*vox_size_x
698 + ((
FLTNB)(vox_y*vox_y))*vox_size_y*vox_size_y
699 + ((
FLTNB)(vox_z*vox_z))*vox_size_z*vox_size_z;
706 nb_voxels_in_neighborhood++;
710 m_neighborhoodMaxNbVoxels = nb_voxels_in_neighborhood;
727 INTNB nb_voxels_in_neighborhood = 0;
729 for (
INTNB vox_z = -neighborhood_box_order_z; vox_z<=neighborhood_box_order_z; vox_z++)
733 if (vox_x!=0 || vox_y!=0 || vox_z!=0)
743 nb_voxels_in_neighborhood++;
747 m_neighborhoodMaxNbVoxels = nb_voxels_in_neighborhood;
779 Cerr(
"***** iPenaltyMarkovRandomField::BuildNeighborhoodKernel() -> The provided shape of neighborhood (" <<
m_neighborhoodShape <<
") is unknown !" << endl);
785 Cerr(
"***** iPenaltyMarkovRandomField::BuildNeighborhoodKernel() -> There is no voxel in the neighborhood ! Check your neighborhood definition." << endl);
809 Cerr(
"***** iPenaltyMarkovRandomField::BuildProximityFactors() -> Proximity kernel has already been created somewhere else !" << endl);
814 Cerr(
"***** iPenaltyMarkovRandomField::BuildProximityFactors() -> Neighborhood kernel must have been created and initialized before !" << endl);
818 FLTNB proximity_factor_sum = 0.;
878 Cerr(
"***** iPenaltyMarkovRandomField::BuildProximityFactors() -> The provided type of proximity factor (" <<
m_proximityType <<
") is unknown !" << endl);
903 INTNB index_x = a_voxel % nb_vox_x;
904 INTNB index_y = (a_voxel/nb_vox_x) % nb_vox_y;
905 INTNB index_z = a_voxel / nb_vox_xy;
916 if ( neighbor_x>=0 && neighbor_x<nb_vox_x && neighbor_y>=0 && neighbor_y<nb_vox_y && neighbor_z>=0 && neighbor_z<nb_vox_z )
954 [a_voxel,a_tbf,a_rbf,a_cbf,a_th,
this](
INTNB i1,
INTNB i2)
957 if (i1 == -1)
return false;
958 if (i2 == -1)
return true;
971 Cerr(
"***** iPenaltyMarkovRandomField::ComputeSimilarityFactors() -> Unknown similarity type provided !" << endl);
988 Cerr(
"***** iPenaltyMarkovRandomField::LocalPreProcessingStep() -> A problem occurred while building specific neighborhood of voxel " << a_voxel <<
" !" << endl);
994 Cerr(
"***** iPenaltyMarkovRandomField::LocalPreProcessingStep() -> A problem occurred while computing the similirity factors of the neighborhood of voxel " << a_voxel <<
" !" << endl);
1016 if (neighbor==-1)
continue;
1026 FLTNB difference = p_image[a_voxel] - p_image[neighbor];
1034 value = 0.5 * difference * difference;
1041 if (denominator==0.) value = 0.;
1042 else value = difference * difference / denominator;
1048 FLTNB squared_difference = difference * difference;
1067 FLTNB abs_difference = fabs(difference);
1069 else value = 0.5 * abs_difference * abs_difference;
1074 if (fpclassify(value) != FP_NORMAL) value = 0.;
1076 else result += proximity_factor * similarity_factor * value;
1082 if (fpclassify(result) != FP_NORMAL) result = 0.;
1102 if (neighbor==-1)
continue;
1112 FLTNB difference = p_image[a_voxel] - p_image[neighbor];
1114 FLTNB first_derivative = 0.;
1120 first_derivative = difference;
1127 FLTNB term_square = term * term;
1128 if (term_square==0.) first_derivative = 0.;
1129 else first_derivative = difference * (term + 2.*p_image[neighbor]) / (term_square);
1135 FLTNB difference = p_image[a_voxel] - p_image[neighbor];
1137 first_derivative = 2. * delta_square * difference
1138 / pow( difference*difference + delta_square , 2. );
1157 if (difference==0.) first_derivative = 0.;
1160 FLTNB abs_difference = fabs(difference);
1162 else first_derivative = difference;
1168 if (fpclassify(first_derivative) != FP_NORMAL) first_derivative = 0.;
1170 else result += proximity_factor * similarity_factor * first_derivative;
1176 if (fpclassify(result) != FP_NORMAL) result = 0.;
1197 if (neighbor==-1)
continue;
1207 FLTNB second_derivative = 0.;
1213 second_derivative = 1.;
1220 FLTNB term_cube = term * term * term;
1221 if (term_cube==0.) second_derivative = 0.;
1222 else second_derivative = (8.*p_image[neighbor]*p_image[neighbor])/(term_cube);
1228 FLTNB difference = p_image[a_voxel] - p_image[neighbor];
1229 FLTNB difference_square = difference * difference;
1231 second_derivative = -2. * delta_square * (3.*difference_square - delta_square)
1232 / pow( difference_square + delta_square , 3. );
1239 second_derivative *= second_derivative;
1245 FLTNB difference = p_image[a_voxel] - p_image[neighbor];
1254 second_derivative = 0.;
1259 if (fpclassify(second_derivative) != FP_NORMAL) second_derivative = 0.;
1261 else result += proximity_factor * similarity_factor * second_derivative;
1267 if (fpclassify(result) != FP_NORMAL) result = 0.;
#define MRF_PROXIMITY_EUCLIDIAN
INTNB m_neighborhoodMaxNbVoxels
int BuildSpecificNeighborhood(INTNB a_voxel, int a_th)
Computes the specific neighborhood of a voxel, m2p_neighborhoodIndices, as well as mp_neighborhoodNbV...
INTNB m_similarityBowsherNbVoxels
int m_penaltyDerivativesOrder
#define MRF_POTENTIAL_HEBERT_LEAHY
FLTNB m_potentialGemanMcClureDelta
oImageSpace * mp_ImageSpace
FLTNB GetVoxSizeX()
Get the voxel's size along the X axis, in mm.
FLTNB m_potentialHuberDelta
#define MRF_PROXIMITY_NONE
FLTNB * mp_proximityKernel
FLTNB GetVoxSizeZ()
Get the voxel's size along the Z axis, in mm.
FLTNB ** m2p_similarityFactors
FLTNB m_potentialRelativeDifferenceGamma
int GetNbMultiModalImages()
Get the number of additional multimodal images.
int BuildProximityFactors()
A function used to build the kernel of the proximity factors.
int LocalPreProcessingStep(int a_tbf, int a_rbf, int a_cbf, INTNB a_voxel, int a_th)
A public function computing a local pre-processing step for the penalty.
int m_neighborhoodBoxOrder
FLTNB ComputeSecondDerivative(int a_tbf, int a_rbf, int a_cbf, INTNB a_voxel, int a_th)
Implementation of the pure virtual vPenalty::ComputeSecondDerivative()
int ReadConfigurationFile(const string &a_configurationFile)
A function used to read options from a configuration file.
FLTNB ComputeFirstDerivative(int a_tbf, int a_rbf, int a_cbf, INTNB a_voxel, int a_th)
Implementation of the pure virtual vPenalty::ComputeFirstDerivative()
#define MRF_NEIGHBORHOOD_SPHERE
#define MRF_POTENTIAL_HUBER
FLTNB m_similarityBowsherThreshold
INTNB ** m2p_neighborhoodKernel
int InitializeSpecific()
This function is used to initialize specific stuff to the child penalty.
FLTNB GetVoxSizeY()
Get the voxel's size along the Y axis, in mm.
#define MRF_SIMILARITY_NONE
INTNB * mp_neighborhoodNbVoxels
#define MRF_POTENTIAL_RELATIVE_DIFFERENCE
FLTNB m_neighborhoodSphereRadius
oImageDimensionsAndQuantification * mp_ImageDimensionsAndQuantification
int ReadDataASCIIFile(const string &a_file, const string &a_keyword, T *ap_return, int a_nbElts, bool a_mandatoryFlag)
Look for "a_nbElts" elts in the "a_file" file matching the "a_keyword" string passed as parameter a...
#define MRF_POTENTIAL_GEMAN_MCCLURE
iPenaltyMarkovRandomField()
The constructor of iPenaltyMarkovRandomField.
INTNB GetNbVoxXY()
Get the number of voxels in a slice.
This class is designed to generically described any penalty applied to MAP algorithms.
Declaration of class iPenaltyMarkovRandomField.
#define KEYWORD_MANDATORY
#define MRF_PROXIMITY_VOXEL
int ReadOptionsList(const string &a_optionsList)
A function used to read options from a list of options.
#define MRF_POTENTIAL_QUADRATIC
FLTNB m_potentialGreenLogCoshDelta
FLTNB m_proximityCharacteristicDistance
FLTNB ComputePenaltyValue(int a_tbf, int a_rbf, int a_cbf, INTNB a_voxel, int a_th)
Implementation of the pure virtual vPenalty::ComputePenaltyValue()
int ComputeSimilarityFactors(int a_tbf, int a_rbf, int a_cbf, INTNB a_voxel, int a_th)
Computes the similarity factors of this specific voxel with respect to the similarity type used...
int GetNbThreadsForImageComputation()
Get the number of threads used for image operations.
~iPenaltyMarkovRandomField()
The destructor of iPenaltyMarkovRandomField.
FLTNB m_potentialHebertLeahyMu
#define MRF_NEIGHBORHOOD_BOX
INTNB GetNbVoxX()
Get the number of voxels along the X axis.
INTNB GetNbVoxZ()
Get the number of voxels along the Z axis.
#define MRF_POTENTIAL_GREEN
int CheckSpecificParameters()
A private function used to check the parameters settings specific to the child penalty.
int BuildNeighborhoodKernel()
A function used to build the neighborhood kernel.
#define MRF_SIMILARITY_BOWSHER
INTNB ** m2p_neighborhoodIndices
void ShowHelpSpecific()
A function used to show help about the child penalty.
#define MRF_NEIGHBORHOOD_6_NEAREST
INTNB GetNbVoxY()
Get the number of voxels along the Y axis.
#define KEYWORD_OPTIONAL_ERROR
int m_neighborhoodBoxExcludeCorners