[Insight-users] Missing use of ReinitializeSeed in MutualInfo.
metric?
Erik Harg
Erik.Harg at idi.ntnu.no
Sat Apr 30 10:12:26 EDT 2005
Hi,
I have a question regarding the randomness (or, rather, the lack of
it) of the random number generator in ImageRandomConstIteratorWithIndex,
as used in the MutualInformationImageToImageMetric.
In my experience, with the same number of sample points, and the same
fixed/moving images, the Iterator always chooses the same sample points,
and the resulting MI metric values are always identical. This is occurring
both under Mac OS X and Linux, using itk versions from 1.8 to 2.0.
As far as I can tell, when the MutualInformationImageToImageMetric calls
the ++randIter, the increment operator of the ImageConstIteratorWithIndex
calls RandomJump(), which in turn uses vnl_sample_uniform(). However, I
have not been able to find any preceding call to the reseed function of
the iterator, nor directly to the vnl_sample_reseed() functions. [1]
In the almost 6 months I have been watching this list, some threads
related to this issue have emerged, but (I believe) not covering exactly
what I am thinking about...
My question then, is this: Am I correct in noticing that the
MutualInformation Metric does not seed the random number generator, and is
there a good reason for it not to use its own ReinitializeSeed() function
(or the one in the Iterator)?
I notice that in some of the RegistrationExamples included with the itk
source, there are specific calls to vnl_sample_reseed(int seed), using
seed=8775070 or 76926294. However, wouldn't it be a more general approach
to let the MI metric, or even the Iterator, handle the seeding, to ensure
that the correct function is called?
There is probably a good answer to this, and I am looking forward to
hearing it! Thank you.
Regards,
Erik
[1]
Looking at the source code for the vnl (vnl_sample.cxx in the
Utilities/vxl/core/vnl directory of the itk source tree), it seems that
this function will either use the drand48() stdlib function if available,
or use a simple congruential random number generator. As far as my
understanding of (pseudo-)random number generators go, both of these need
a decent seed to provide anything close to random
numbers. The congruential generator that is built into the vnl has a
static seed of 12345, unless a call to vnl_sample_reseed() or
vnl_sample_reseed(int seed) precedes the vnl_sample_uniform()
function call. However, when vnl is using the drand48(), no default
seeding (using srand48()) is done, and I believe the last system provided
seed is used(?). Thus, any call to vnl_sample_uniform() should be preceded
by a call to vnl_sample_reseed() (which uses the vcl_time(0) as seed to
srand48()), or to vnl_sample_reseed(int seed) using some user defined
seed. Only this will ensure a basic pseudo-random behaviour of the uniform
random number generator, I believe.
--
*----------------------------------------------------------*
| Erik Harg 924 98 541 Erik.Harg at idi.ntnu.no |
| NTNU - Trondheim |
*----------------------------------------------------------*
More information about the Insight-users
mailing list