[Insight-users] NumericLimits::min float / int Inconsistency Workaround?
Luis Ibanez
luis.ibanez at kitware.com
Wed May 20 22:08:52 EDT 2009
Hi Geoff,
If what you want is to get all values larger than zero,
what is wrong with using:
UpperThreshold = NumericTraits<T>::max()
LowerThreshold = NumericTraits<T>::Zero
??
Something is contradictory in your description of
requiremets.
Luis
-------------------------
Geoff Topping wrote:
> Hi all,
>
> I'm trying to make an itk::BinaryThresholdImageFilter with a lower bound that includes all values larger than zero. Doing this in a generic way has proven difficult due to the inconsistency in how itk::NumericLimits reports min values for float or integer types.
>
> To clarify, this code:
>
> std::cout << "NumericTraits float min: " << itk::NumericTraits::min() << std::endl;
> std::cout << "NumericTraits signed short min: " << itk::NumericTraits::min() << std::endl;
>
> outputs this:
>
> NumericTraits float min: 1.17549e-38
> NumericTraits signed short min: -32768
>
> And since I'm working with signed short pixels, I can't use NumericTraits::min() to set the lower threshold for my filter (although I presumably could if I was using float pixel type).
>
>
> This issue is not unique to itk::NumericTraits, but is present in std::numeric_limits as well, for reasons that are irrelivant to this discussion.
>
>
> My question: Is there a reccommended ITK style workaround for this?
>
> I want to be able to set the lower-threshold for my filter in a generic way, so don't want to set it to constants 1 (integer), as that would be well above the minimum positive value for a float type pixel.
>
> I can't use NumericTraits to get the positive minimum value representable by the type, although NumericTraits seems to be the standard way of getting this sort of information in ITK code.
>
> I could use a separate thresholding step to get a mask image with NumericLimits::Zero for values between NumericLimits::NonpositiveMin and NumericLimits::Zero and NumericLimits::One outside that range, and then multiply my original image by this mask to get a nonnegative image, and then apply a separate threshold filter on that, but I shouldn't need to do those extra steps.
>
>
> Notably, there exist implmentations of similar functions to resolve this, including one in the Boost libraries:
>
> http://www.boost.org/doc/libs/1_38_0/libs/numeric/conversion/doc/html/boost_numericconversion/bounds___traits_class.html
>
> I'm not using any Boost code in my current programs, though.
>
>
> Is there a reason NumericTraits doesn't have a function to provide the value I need?
>
> NumericTraits does have a NonpositiveMin() function, for a similar purpose, which is implemented differently for float and integer types:
>
> static float NonpositiveMin() { return -vcl_numeric_limits::max(); }
>
> static int NonpositiveMin() { return vcl_numeric_limits::min(); }
>
>
> Thanks,
> Geoff Topping
>
>
> _________________________________________________________________
> Create a cool, new character for your Windows Live™ Messenger.
> http://go.microsoft.com/?linkid=9656621
> _____________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the ITK FAQ at: http://www.itk.org/Wiki/ITK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.itk.org/mailman/listinfo/insight-users
>
More information about the Insight-users
mailing list