[Insight-developers] BUG in BinaryBallStructuringElement
Bill Lorensen
bill.lorensen at gmail.com
Wed Oct 16 15:12:00 EDT 2013
Dirk,
Is there anything in the literature that we can use to validate this?
Your logic seems correct to me.
Bill
On Wed, Oct 16, 2013 at 2:05 PM, Padfield, Dirk R (GE Global Research)
<padfield at 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
>
> 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
--
Unpaid intern in BillsBasement at noware dot com
More information about the Insight-developers
mailing list