[ITK Community] [Insight-developers] Insight-developers Digest, Vol 115, Issue 1

Padfield, Dirk R (GE Global Research) padfield at research.ge.com
Thu Dec 26 13:01:39 EST 2013


Hi Richard,

It looks like this old thread was re-posted; not sure why.  But I thought I would respond in case any clarity is needed.

The patch to address this issue has already been merged: http://review.source.kitware.com/#/c/13116/

The implementation, based on consensus, was to add a flag to the FlatStructuringElement code to enable users to change the mode if desired.  No changes were made to the defaults.

Thanks,
Dirk


On Dec 24, 2013, at 12:00 PM, insight-developers-request at itk.org wrote:

> Send Insight-developers mailing list submissions to
> 	insight-developers at itk.org
> 
> To subscribe or unsubscribe via the World Wide Web, visit
> 	http://www.itk.org/mailman/listinfo/insight-developers
> or, via email, send a message with subject or body 'help' to
> 	insight-developers-request at itk.org
> 
> You can reach the person managing the list at
> 	insight-developers-owner at itk.org
> 
> When replying, please edit your Subject line so it is more specific
> than "Re: Contents of Insight-developers digest..."
> 
> 
> Today's Topics:
> 
>   1. Re: BUG in BinaryBallStructuringElement (Richard Beare)
> 
> 
> ----------------------------------------------------------------------
> 
> Message: 1
> Date: Fri, 18 Oct 2013 09:21:27 +1100
> From: Richard Beare <richard.beare at gmail.com>
> To: "Johnson, Hans J" <hans-johnson at uiowa.edu>
> Cc: "insight-developers at itk.org" <insight-developers at itk.org>,
> 	"Padfield,	Dirk R \(GE Global Research\)" <padfield at research.ge.com>
> Subject: Re: [Insight-developers] BUG in BinaryBallStructuringElement
> Message-ID:
> 	<CA+V7QS_yN1tfqcuNeNS1HLGjna5gmY6FeZzjK=6RpFZr=9HdSA at mail.gmail.com>
> Content-Type: text/plain; charset="iso-8859-1"
> 
> Hi all,
> I haven't been involved in the thread till now.
> 
> A couple of points that may have been covered somewhere in the thread.
> 
> The original binary ball structuring element has been part of ITK almost
> for ever. It uses Bresenham sphere's/circles - this leads to one criteria
> for whether a voxel is inside or outside. From memory the decision is based
> on whether any part of a voxel is closer than the specified radius. The
> original motivation was apparently the Bresenham algorithm that used only
> integer arithmetic.
> 
> This is one choice for approximating circles/spheres with voxels, but
> obviously not the only one. Other obvious choices are 1) centre of voxel
> must be closer than the radius to be inside or 2) all of a voxel must be
> inside. Any of these options look OK for larger circles and all can look
> bad for small ones.
> 
> I'd certainly be supporting Brad's advice of not changing the current
> defaults. The best option, if people are really unhappy with the current
> circles, is to make it a bit easier to import an image as a structuring
> element and use that. There was some code floating around in the original
> contribution that did this, but it may have been lost.
> 
> Here's a summary of how I remember the structuring element options via the
> grayscale morphology tools:
> 
> Do use the FlatStructuringElement. It ties all the algorithms together and
> provides a consistent interface. "Flat" refers to binary, not 2D - i.e a
> structuring element of 1's and 0's rather than a structuring function of
> arbitrary values (e.g. ranging from 0 to 1).
> 
> 1)  If you use the "Ball" option :
> 
>  typedef typename itk::FlatStructuringElement< dim > SRType;
> 
>  typename SRType::RadiusType rad;
>  rad.Fill(10);
>  SRType kernel;
> 
>  kernel = SRType::Ball(rad);
> 
> Then the ball will be constructed using the BinaryBallStructuringElement
> code.
> 
> You then have a choice of algorithm
> a) Default, direct implementation
> b) Sliding histogram
> 
> sliding histogram is much faster for anything bigger than the unit SE.
> Sliding histogram gives identical results to the direct implementation
> 
> Naive: O(n^d)
> Histogram : O(n^(d-1))
> 
> where n=radius, d=SE dimension.
> 
> 2) Poly option:
> 
> This is an example of the decomposition approach. A circle is constructed
> by repeated applications of lines at angles. The approximation is quite
> good - there are some pictures in the IJ paper, or you can generate them by
> dilating a single voxel. However it is difficult to achieve an exact
> radius. For example you might be able to get a good radius 25 circle, but
> have trouble getting something that is 26. The construction approach
> attempts to be smart about the number of angles and length of lines, but it
> isn't possible to achieve perfect circles of arbitrary size this way.
> 
> There is code for 3D, but the approximations to spheres are not great. You
> can get cubes with corners cut off and some more complex shapes, but these
> need to be quite big to be useful.
> 
> The big benefit of this option is low complexity:
> 
> k O(const), where k is the line count in the decomposition.
> 
> 3) Box
> basically a special case of the Poly. These are exact boxes.
> 
> 
> These are all for greyscale images, but work on binary too. However there
> are some other options for operations with circles/spheres on binary images
> that I can go into if this is of interest.
> 
> Finally, just a practical note based on personal experience:
> 
> I find that exact structuring element size isn't usually a big concern.
> Typically, when I want to use a large structuring element it is to
> eliminate larger objects, so it really doesn't matter if the size isn't
> exactly what I requested. If it does matter then the approach is never
> going to be reliable.
> 
> Hope this helps
> 
> 
> 
> On Fri, Oct 18, 2013 at 7:27 AM, Johnson, Hans J <hans-johnson at uiowa.edu>wrote:
> 
>> I like the idea of a new element the best.  It keeps it clean and easy to
>> replace.
>> 
>> Hans
>> 
>> 
>> -----Original Message-----
>> From: <Miller>, "James V   (GE Global Research)" <millerjv at ge.com>
>> Date: Thursday, October 17, 2013 2:45 PM
>> To: Bradley Lowekamp <blowekamp at mail.nih.gov>, "Padfield, Dirk R (GE
>> Global Research)" <padfield at research.ge.com>
>> Cc: Richard Beare <richard.beare at gmail.com>, Hans Johnson
>> <hans-johnson at uiowa.edu>, ITK <insight-developers at itk.org>
>> Subject: RE: [Insight-developers] BUG in BinaryBallStructuringElement
>> 
>> Our current element does not build the ball by alternating the application
>> of crosses and boxes.  Perhaps we should have an element that does it that
>> way.  For speed, I think old school morphology would not build a large
>> structuring element but apply small elements in a particular sequence to
>> the image (dilate with triangle, dilate with rotated triangle, ...).
>> 
>> I like the idea of introducing a new structuring element that implements
>> Dirk's design.  I'd also be happy with a mode on the current element to
>> switch between the behaviors as long as the default was the current
>> behavior.
>> 
>> 
>> 
>> -----Original Message-----
>> From: insight-developers-bounces at itk.org
>> [mailto:insight-developers-bounces at itk.org] On Behalf Of Bradley Lowekamp
>> Sent: Thursday, October 17, 2013 1:44 PM
>> To: Padfield, Dirk R (GE Global Research)
>> Cc: Richard Beare; Johnson, Hans J; insight-developers at itk.org
>> Subject: Re: [Insight-developers] BUG in BinaryBallStructuringElement
>> 
>> Dirk,
>> 
>> First, I have been using the FlatStructuringElement class as opposed to
>> the BinaryBallStructuring element. Does the resulting shape differ? I
>> think they should be consistent.
>> 
>> Please, please do not  change the shape of the current structuring
>> elements.
>> 
>> Many optimized usage and implementation of morphology rely on a specific
>> decomposition of the binary ball structuring element. To create a ball,
>> you are alternate between a 1-cross and a 1-box. I believe your change is
>> simple switching for the cross be for the box. Which would make such
>> decomposition optimization inconsistent.
>> 
>> I would suggest you create a new structuring element class to meet you
>> needs. I think this would make a easier transition of we wish to deprecate
>> the current version in favor of yours interpretation of correctness.
>> 
>> I would like to hear from Richard Beare and/or Gaetan on this issue. They
>> are the resident morphology experts in our community.
>> 
>> 
>> Brad
>> 
>> On Oct 17, 2013, at 1:14 PM, "Padfield, Dirk R (GE Global Research)"
>> <padfield at research.ge.com> wrote:
>> 
>>> Hi Ho,
>>> 
>>> Thanks for looking into this more closely.  Your agreement that this is
>>> a bug is encouraging!
>>> 
>>> Now, what to do...This is the perennial battle between backward
>>> compatibility and future correctness!
>>> 
>>> Hans' suggestion to add a member function to enable the correct behavior
>>> makes sense.  But I am concerned that it adds additional complexity and
>>> that these methods will be ignored if not set as default.
>>> 
>>> Hans, what do you think about the idea of adding such a method and then
>>> marking the old method as deprecated and setting an
>>> ITK_FUTURE_LEGACY_REMOVE flag?
>>> 
>>> Thanks,
>>> Dirk
>>> 
>>> ________________________________
>>> From: Ho Cheung [hocheung20 at gmail.com]
>>> Sent: Thursday, October 17, 2013 12:22 PM
>>> To: Padfield, Dirk R (GE Global Research)
>>> Subject: Re: [Insight-developers] BUG in BinaryBallStructuringElement
>>> 
>>> I totally agree that the corrected version is more accurate.
>>> 
>>> Upon examining the code more closely and further thought, it also does
>>> seem to be an oversight by the original author.
>>> 
>>> Furthermore, my suggestion that it was simply a discretization problem
>>> turns out to be a non-sequiter. It turns out that the additional pixel on
>>> the axes length was approximating the "rounding discretization process"
>>> for the radius sizes I was looking at.
>>> 
>>> I do share the same concerns about backwards compatibility as Hans and
>>> Wes, but definitely I'll change my opinion of this to being an actual bug.
>>> 
>>> Regards,
>>> 
>>> Ho Cheung
>>> (775) 388-2368
>>> 
>>> On Oct 17, 2013, at 8:09 AM, Padfield, Dirk R (GE Global Research)
>>> <padfield at research.ge.com<mailto:padfield at research.ge.com>> wrote:
>>> 
>>> Hi Ho,
>>> 
>>> Thanks for your feedback and insight!  I agree that discretizing
>>> continuous functions is always a tricky thing.  Luckily, we have the
>>> spatial objects to help with this since they define their own
>>> inside-outside tests.  The Ellipse spatial object is used in the
>>> BinaryBallStructuringElement implementation, but the problem is that the
>>> spatial object itself is used incorrectly.  By definition, the axes
>>> should be "radius*2" rather than "radius*2+1".  Defining the axes of an
>>> ellipse/circle to be "radius*2+1" is simply an error.
>>> 
>>> We can also attack this question by considering the area of the
>>> continuous function versus the discretized version by counting the number
>>> of "on" pixels in the kernel as follows:
>>> 
>>> For radius=1, the true area is pi = 3.14 Using the old version, we get
>>> 9 Using the correction, we get 5
>>> 
>>> For radius=5, the true area is 25*pi = 78.5 Using the old version, we
>>> get 97 (24% error) Using the correction, we get 81 (3% error)
>>> 
>>> For radius=11, the true area is 121*pi = 380 Using the old version, we
>>> get 421 (11% error) Using the correction, we get 377 (1% error)
>>> 
>>> For radius=21, the true area is 21*21*pi = 1385 Using the old version,
>>> we get 1457 (5% error) Using the correction, we get 1373 (1% error)
>>> 
>>> As expected, as the radius increases, the discretized version better
>>> approximates the continuous function.  We can also see that the corrected
>>> version is always more accurate than the old version.
>>> 
>>> What do you think?
>>> 
>>> Thanks,
>>> Dirk
>>> 
>>> 
>>> ________________________________
>>> From: Ho Cheung [hocheung20 at gmail.com<mailto:hocheung20 at gmail.com>]
>>> Sent: Wednesday, October 16, 2013 6:26 PM
>>> To: Padfield, Dirk R (GE Global Research)
>>> Cc: ITK
>>> Subject: Re: [Insight-developers] BUG in BinaryBallStructuringElement
>>> 
>>> Dirk,
>>> 
>>> As a counterpoint, I do not agree that there is a bug but rather just an
>>> ambiguity in the way we have defined whether or not a pixel is to be
>>> included.
>>> 
>>> If you take a protractor and plotted a unit circle, then superimpose a
>>> grid on it (this this case, 3x3), and then shaded in the nearest pixels
>>> to the circle, it would look like the "original" example. The same
>>> applies to the radius 5 circle.
>>> 
>>> Technically, if you look at the parametric definition of a circle, then
>>> yes, those pixels would not be included, as their physical space points
>>> fall outside the circle.
>>> 
>>> However, I believe (anecdotal) in graphics rendering, it is common
>>> practice to include those pixels which are nearest to the actual physical
>>> space point.
>>> 
>>> Regards,
>>> 
>>> Ho Cheung
>>> (775) 388-2368
>>> 
>>> On Oct 16, 2013, at 1:05 PM, Padfield, Dirk R (GE Global Research)
>>> <padfield at research.ge.com<mailto:padfield at research.ge.com><mailto:
>> padfield
>>> @research.ge.com>> wrote:
>>> 
>>> Hi All,
>>> 
>>> I am writing to ask your advice about a bug I found in
>>> BinaryBallStructuringElement.
>>> 
>>> For a while, I have been bothered by the fact that the
>>> BinaryBallStructuringElement return balls that are larger than the
>>> specified radius.  For example, when given a radius of 1, it returns the
>>> structuring element:
>>> 1    1    1
>>> 1    1    1
>>> 1    1    1
>>> 
>>> But this structuring element has a radius that is more than 1!  If it
>>> truly had a radius of 1, it would be a cross shape in this case.
>>> 
>>> When choosing a larger radius, the problem is more obvious.  Setting
>>> radius = 5 (leading to a structuring element size of 11x11) results in:
>>> 0    0    0    1    1    1    1    1    0    0    0
>>> 0    0    1    1    1    1    1    1    1    0    0
>>> 0    1    1    1    1    1    1    1    1    1    0
>>> 1    1    1    1    1    1    1    1    1    1    1
>>> 1    1    1    1    1    1    1    1    1    1    1
>>> 1    1    1    1    1    1    1    1    1    1    1
>>> 1    1    1    1    1    1    1    1    1    1    1
>>> 1    1    1    1    1    1    1    1    1    1    1
>>> 0    1    1    1    1    1    1    1    1    1    0
>>> 0    0    1    1    1    1    1    1    1    0    0
>>> 0    0    0    1    1    1    1    1    0    0    0
>>> 
>>> This is clearly not an ellipse/circle with radius 5 because the interior
>>> ellipse/circle is touching each image border at five points rather than
>>> just one.  As it turns out, the code is actually defining a radius that
>>> is "X + 0.5", where X is the radius that is requested!
>>> 
>>> The problem is in the specification of the ellipse axes on lines 70-76
>>> of itkBinaryBallStructuringElement.hxx:
>>> // Define and set the axes lengths for the ellipsoid typename
>>> EllipsoidType::InputType axes; for ( i = 0; i < VDimension; i++ )  {
>>> axes[i] = this->GetSize(i);  }
>>> spatialFunction->SetAxes(axes);
>>> 
>>> In this case, "this->GetSize()" is equal to radius*2+1.  But, an
>>> ellipse/circle with radius X should have axes length 2X, not 2X+1!  In
>>> the implementation, the center of the ellipse is properly accounted for
>>> by setting it to "this->GetRadius+1", but the size of the ellipse is not
>>> correct!
>>> 
>>> To correct this, we can make a simple change either  axes[i] =
>>> this->GetSize(i) - 1; or  axes[i] = this->GetRadius(i) * 2;
>>> 
>>> The second is probably more intuitive.
>>> 
>>> With this fix, we get for radius=1:
>>> 0    1    0
>>> 1    1    1
>>> 0    1    0
>>> 
>>> and for radius=5:
>>> 0    0    0    0    0    1    0    0    0    0    0
>>> 0    0    1    1    1    1    1    1    1    0    0
>>> 0    1    1    1    1    1    1    1    1    1    0
>>> 0    1    1    1    1    1    1    1    1    1    0
>>> 0    1    1    1    1    1    1    1    1    1    0
>>> 1    1    1    1    1    1    1    1    1    1    1
>>> 0    1    1    1    1    1    1    1    1    1    0
>>> 0    1    1    1    1    1    1    1    1    1    0
>>> 0    1    1    1    1    1    1    1    1    1    0
>>> 0    0    1    1    1    1    1    1    1    0    0
>>> 0    0    0    0    0    1    0    0    0    0    0
>>> 
>>> This is a true circle with radius 5!
>>> 
>>> My questions are:
>>> 1) Is anyone else bothered by this bug?  I imagine that many users
>>> expect the corrected version and don't realize they are getting the
>>> incorrect one.
>>> 2) Do others agree with this fix?
>>> 3) Can we make this fix given the number of filters/applications that
>>> will change slightly as a result of this fix?
>>> 
>>> Many thanks,
>>> Dirk
>>> 
>>> 
>>> 
>>> _______________________________________________
>>> Powered by
>>> www.kitware.com<http://www.kitware.com><http://www.kitware.com>
>>> 
>>> Visit other Kitware open-source projects at
>>> http://www.kitware.com/opensource/opensource.html
>>> 
>>> Kitware offers ITK Training Courses, for more information visit:
>>> http://kitware.com/products/protraining.php
>>> 
>>> 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-developers
>>> 
>>> 
>>> _______________________________________________
>>> Powered by www.kitware.com
>>> 
>>> Visit other Kitware open-source projects at
>>> http://www.kitware.com/opensource/opensource.html
>>> 
>>> Kitware offers ITK Training Courses, for more information visit:
>>> http://kitware.com/products/protraining.php
>>> 
>>> 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-developers
>> 
>> _______________________________________________
>> Powered by www.kitware.com
>> 
>> Visit other Kitware open-source projects at
>> http://www.kitware.com/opensource/opensource.html
>> 
>> Kitware offers ITK Training Courses, for more information visit:
>> http://kitware.com/products/protraining.php
>> 
>> 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-developers
>> 
>> 
>> 
>> ________________________________
>> Notice: This UI Health Care e-mail (including attachments) is covered by
>> the Electronic Communications Privacy Act, 18 U.S.C. 2510-2521, is
>> confidential and may be legally privileged.  If you are not the intended
>> recipient, you are hereby notified that any retention, dissemination,
>> distribution, or copying of this communication is strictly prohibited.
>> Please reply to the sender that you have received the message in error,
>> then delete it.  Thank you.
>> ________________________________
>> 
> -------------- next part --------------
> An HTML attachment was scrubbed...
> URL: <http://www.itk.org/pipermail/insight-developers/attachments/20131018/cc3d711c/attachment.html>
> 
> ------------------------------
> 
> _______________________________________________
> Insight-developers mailing list
> Insight-developers at itk.org
> http://www.itk.org/mailman/listinfo/insight-developers
> 
> 
> End of Insight-developers Digest, Vol 115, Issue 1
> **************************************************

_______________________________________________
Powered by www.kitware.com

Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html

Kitware offers ITK Training Courses, for more information visit:
http://kitware.com/products/protraining.php

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-developers


More information about the Community mailing list