[ITK-users] Patch for ApproximateSignedDistanceMapImageFilter

Chr. Rossmanith cr at neuro.ma.uni-heidelberg.de
Fri Mar 31 08:07:13 EDT 2017


Hi,

2nd attempt using approach 1)  (see below). What about typos in comments 
I removed during bug fixing? Include into this patch as well or keep 
them separate?

Additionally you find a small application creating an image with a 
bright square on dark background which displays the image together with 
the result of ApproximateSignedDistanceMapImageFilter. The pixel value 
of the square is 1 by default but can be changed via command line.

Regards,
Christina


On 29.03.2017 15:12, Francois Budin wrote:
> Hello Christina,
>
> I see different paths to try to solve this issue and I am not sure 
> which one is the best one:
> 1) You could modify the itkIsoContourDistanceImageFilter class so that 
> m_LevelSetValue is of some real type. When looking in the 
> implementation of this filter,  you can see that sometimes, 
> m_LevelSetValue is casted to a real type [1], so maybe it makes sense 
> to do that.
> 2) Casting is one solution, but you have to be careful if you want to 
> cast to float or double. If you cast to float, and the input is of 
> type double, you will loose precision. If you always cast to double, 
> you might use a lot of memory. Sadly, in the itkNumericTraits, there 
> is no way of asking for "the smallest floating type that contains my 
> current type". You can call "RealType" which will be "double", or 
> "FloatType" which will be float. One strength of casting, is that if 
> you perform it in place, it can actually not do anything if it doesn't 
> need to [2].
> 3) To avoid casting when you don't need to (your type is float or 
> double), you could use the SFINAE concept like it is used here [3]. 
> This is more complex and may not be worth it.
>
> Beware that images may contain pixels that are not only scalar values, 
> but also RGB, RGBA, vectors. I am not sure if the ApproximateDistance 
> filter supports these types, but it is good to be careful, when 
> modifying the code, to not restrict the usage of a filter to scalar if 
> not required. To avoid that kind of issues, and to answer your 
> original question, you can use the Rebind structure [4].
>
> I hope this helps.
> I will be out of town for a week, and most likely will have limited to 
> no access to the internet, so don't be surprised if I do not answer 
> your next message within the next week.
>
> Thanks for helping!
> Francois
>
> [1] 
> https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/Filtering/DistanceMap/include/itkIsoContourDistanceImageFilter.hxx#L314
> [2] 
> https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/Filtering/ImageFilterBase/include/itkCastImageFilter.hxx#L42
> [3] 
> https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/IO/ImageBase/include/itkConvertPixelBuffer.h#L153-L161
> [4] 
> https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/Filtering/Smoothing/include/itkSmoothingRecursiveGaussianImageFilter.h#L84-L85
>
> On Wed, Mar 29, 2017 at 7:10 AM, Chr. Rossmanith 
> <cr at neuro.ma.uni-heidelberg.de <mailto:cr at neuro.ma.uni-heidelberg.de>> 
> wrote:
>
>     Hi Francois,
>
>     I'm getting back to this issue. I'll introduce an intermediate
>     image in the mini pipeline used in
>     ApproximateSignedDistanceMapImageFilter which has a floating type
>     for pixel values. Given
>
>       /** Type for input image. */
>       typedef TInputImage InputImageType;
>
>     how can I define a corresponding image type FloatImageType
>     replacing the unknown pixel type by float? I can't write
>     itk::Image< float, xxx > because I don't know xxx.
>
>     Is there a way to query the pixel type to avoid applying the
>     CastImageFilter in case we already get floating valued pixels?
>
>     Christina
>
>
>
>     On 03.03.2017 14:58, Francois Budin wrote:
>>     Hi Christina,
>>
>>     Maybe your idea was good but needs more work (e.g. cast the input
>>     image to the output type? at least if input is not a float, or
>>     maybe something else). I am glad you found a solution that works
>>     for you. If you need your software to be faster, you can also
>>     replace the SignedDanielssonDistanceMap with the
>>     SignedMauerDistanceMap [1].
>>
>>     Hope this helps, and thanks for your contribution. Do not
>>     hesitate to submit a new patch to solve your original problem if
>>     you find a solution.
>>
>>     Francois
>>     [1]
>>     https://itk.org/Doxygen/html/classitk_1_1SignedMaurerDistanceMapImageFilter.html
>>     <https://itk.org/Doxygen/html/classitk_1_1SignedMaurerDistanceMapImageFilter.html>
>>
>>     On Fri, Mar 3, 2017 at 8:23 AM, Chr. Rossmanith
>>     <cr at neuro.ma.uni-heidelberg.de
>>     <mailto:cr at neuro.ma.uni-heidelberg.de>> wrote:
>>
>>         Hi Francois,
>>
>>         really strange, on Wednesday changing the data type made my
>>         application work as expected (but obviously there must have
>>         been an additional change which really made the application
>>         work...). When trying to build a small example for you, I
>>         failed. I still think that feeding a 0/1 image into
>>         ApproximateSignedDistanceMapImageFilter makes sense.
>>
>>         Originally I'm interested in ContourExtractor2D, which
>>         operates on a distance map using 0 as contour level. Unlike
>>         in the  ContourExtractor2D example I've decided to use
>>         SignedDanielssonDistanceMap which works fine without any patches.
>>
>>         So send the patch to /dev/null for the moment...
>>
>>         Christina
>>
>>
>>          On 02.03.2017 16:17, Francois Budin wrote:
>>>         Hello Christina,
>>>
>>>         I just reviewed you patch. You are changing the type of the
>>>         variable levelSetValue to OutputPixelType which is suppose
>>>         to be a floating point value.
>>>         However, the computation is done with InputPixelType
>>>         variables (m_InsideValue and m_OutsideValue) and divided by
>>>         an integer. Additionally, the resulting value is used in:
>>>         m_IsoContourFilter->SetLevelSetValue(levelSetValue);
>>>
>>>         which accepts values of InputPixelType [1] since
>>>         IsoContourType is defined as:
>>>           typedef IsoContourDistanceImageFilter< InputImageType,
>>>         OutputImageType > IsoContourType;
>>>
>>>         I am not sure if your patch solves the problem that you
>>>         mentioned. Do you have a test that would verify that the new
>>>         behavior corresponds to your expectations? Based on the code
>>>         review I have done, I would not expect the behavior of the
>>>         filter to change.
>>>
>>>         Let me know if I missed a detail. Thank you for your
>>>         contribution!
>>>         Francois
>>>
>>>         [1]
>>>         https://itk.org/Doxygen/html/classitk_1_1IsoContourDistanceImageFilter.html
>>>         <https://itk.org/Doxygen/html/classitk_1_1IsoContourDistanceImageFilter.html>
>>>
>>>         On Wed, Mar 1, 2017 at 8:12 AM, Chr. Rossmanith
>>>         <cr at neuro.ma.uni-heidelberg.de
>>>         <mailto:cr at neuro.ma.uni-heidelberg.de>> wrote:
>>>
>>>             For binary images with 0 for background and 1 for
>>>             objects with an integer input pixel type there is a
>>>             problem representing the average of 0 and 1 = 0.5 with
>>>             the input pixel type. The output pixel type is required
>>>             to be a floating pixel type (filter documentation), so
>>>             it should be safe to change the type of levelSetValue to
>>>             OutputPixelType.
>>>
>>>             Regards,
>>>             Christina
>>>
>>>
>>>             _____________________________________
>>>             Powered by www.kitware.com <http://www.kitware.com>
>>>
>>>             Visit other Kitware open-source projects at
>>>             http://www.kitware.com/opensource/opensource.html
>>>             <http://www.kitware.com/opensource/opensource.html>
>>>
>>>             Kitware offers ITK Training Courses, for more
>>>             information visit:
>>>             http://www.kitware.com/products/protraining.php
>>>             <http://www.kitware.com/products/protraining.php>
>>>
>>>             Please keep messages on-topic and check the ITK FAQ at:
>>>             http://www.itk.org/Wiki/ITK_FAQ
>>>             <http://www.itk.org/Wiki/ITK_FAQ>
>>>
>>>             Follow this link to subscribe/unsubscribe:
>>>             http://public.kitware.com/mailman/listinfo/insight-users
>>>             <http://public.kitware.com/mailman/listinfo/insight-users>
>>>
>>>
>>
>>
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/insight-users/attachments/20170331/cf83a8d7/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-BUG-calculate-levelSetValue-for-IsoContourFilter-wit.patch
Type: text/x-patch
Size: 4861 bytes
Desc: not available
URL: <http://public.kitware.com/pipermail/insight-users/attachments/20170331/cf83a8d7/attachment.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ApproximateSignedDistanceMapImageFilter.cxx
Type: text/x-c++src
Size: 2704 bytes
Desc: not available
URL: <http://public.kitware.com/pipermail/insight-users/attachments/20170331/cf83a8d7/attachment.cxx>


More information about the Insight-users mailing list