[Insight-users] problems with morphological close
Rohit Saboo
rohit at cs.unc.edu
Tue Mar 2 14:45:37 EST 2010
As an interesting note, when I use BinaryDilateImageFilter and
BinaryErodeImageFilter in place of DilateObjectMorphologyImageFilter and
ErodeObjectMorphologyImageFilter, the images come out exactly as I expect.
To me this is looking like a bug with DilateObjectMorphologyImageFilter and
ErodeObjectMorphologyImageFilter.
>
>
Rohit
On Tue, Mar 2, 2010 at 11:24 AM, Rohit Saboo <rohit at cs.unc.edu> wrote:
> Hi Alberto,
>
> I'll explain what I'm doing in a bit. It may not be best for the purpose
> intended, however, the problem that I've observed still should not be there.
> The closed structure always contains the original structure. However, if you
> look closely at the images I have posted, the closed structure is thinner
> than the original one.
>
> The structure that I'm working with is a mandible. There are several issues
> with these images - holes, teeth, etc. The slices that I've posted do not
> have holes, but the error can be seen more easily here. Further, the
> particular image that I produced is developed by a structuring element of
> radius 1. I'll use structuring elements of larger radii if there are larger
> holes.
>
> The object is long and thin in some areas and blob-like in others. Further
> the direction in which the object is thin is not constant; so, I feel that
> using the same long thin structuring element everywhere may make things
> worse.
>
> Rohit
>
>
>
> On Tue, Mar 2, 2010 at 5:15 AM, Gomez, Alberto <alberto.gomez at kcl.ac.uk>wrote:
>
>> Hello,
>>
>> I don't know if I had understood what you want to do. The original image
>> you are using is "already closed", unless you want to link the two white
>> figures. If that is the case, you wont be able to do that; a morphological
>> close will only "fill" blanks or holes which are smaller than the full
>> figure (and that the structuring element). You are using an structuring
>> element (ball) of size 1, which means that you will not be able to close
>> spaces bigger than 1.
>>
>> Apart from that, I think the results you are getting are coherent,
>> although it is difficult to say without knowing the image resolution.
>>
>> Please, can you explain in more detail what you expect to get?
>>
>> Finally, If you want to close long and thin objects, the ball is probably
>> not the best kernel, try something with the same shape as the object.
>>
>> hth
>>
>> Alberto
>>
>>
>>
>> Rohit Saboo wrote:
>>
>>> Hello:
>>>
>>> I'm trying to do a morphological close by dilating the input image and
>>> then following it with the input image. However, it seems that I'm not using
>>> the filters properly because the results don't look like the result of a
>>> close operation. Can someone point out to me what I'm doing wrong.
>>>
>>> Axial slices of the images (at the same position) are at the following
>>> locations:
>>> 1. original image - http://www.cs.unc.edu/~rohit/stuff/original.png<http://www.cs.unc.edu/%7Erohit/stuff/original.png>
>>> 2. (intermediate) dilated image -
>>> http://www.cs.unc.edu/~rohit/stuff/dilated.png<http://www.cs.unc.edu/%7Erohit/stuff/dilated.png>
>>> 3. (final) closed image -
>>> http://www.cs.unc.edu/~rohit/stuff/closed.png<http://www.cs.unc.edu/%7Erohit/stuff/closed.png>
>>>
>>> I'm including the parts of the code related to the close operation. The
>>> function below is called with a radius of 1.
>>>
>>> typedef unsigned short Pixel;
>>> typedef Image<Pixel, 3> ImageType;
>>> typedef ImageType::Pointer ImagePointer;
>>>
>>> ImagePointer closeImage( ImagePointer image, const unsigned int radius )
>>> {
>>> // The ball structuring element:
>>> typedef BinaryBallStructuringElement<Pixel, 3> Kernel;
>>> // The dilation filter
>>> typedef DilateObjectMorphologyImageFilter<ImageType, ImageType,
>>> Kernel> DilateFilter;
>>> // The erosion filter
>>> typedef ErodeObjectMorphologyImageFilter<ImageType, ImageType, Kernel>
>>> ErodeFilter;
>>>
>>> // Create the structuring element:
>>> cout << "Creating structuring element ... " << flush;
>>> Kernel ball;
>>> ball.SetRadius(radius);
>>> ball.CreateStructuringElement();
>>> cout << "done" << endl;
>>>
>>> writeImage<ImageType>(image, "original.mhd");
>>>
>>> // Now do the close operation
>>> cout << "Dilating ... " << flush;
>>> DilateFilter::Pointer closeDilate = DilateFilter::New();
>>> closeDilate->SetObjectValue(1);
>>> closeDilate->SetKernel(ball);
>>> closeDilate->SetInput(image);
>>> closeDilate->Update();
>>> cout << "done" << endl;
>>> writeImage<ImageType>(closeDilate->GetOutput(), "dilated.mhd");
>>>
>>> cout << "Eroding ... " << flush;
>>> ErodeFilter::Pointer closeErode = ErodeFilter::New();
>>> closeErode->SetObjectValue(1);
>>> closeErode->SetKernel(ball);
>>> closeErode->SetInput(closeDilate->GetOutput());
>>> closeErode->Update();
>>> cout << "done" << endl;
>>> writeImage<ImageType>(closeErode->GetOutput(), "closed.mhd");
>>>
>>> return closeErode->GetOutput();
>>> }
>>>
>>>
>>> Rohit
>>>
>>>
>>>
>>
>>
>> --
>>
>> Alberto Gómez
>>
>> /Division of Imaging Sciences
>> The Rayne Institute
>> 4th Floor, Lambeth Wing
>> St Thomas' Hospital
>> London SE1 7EH /
>>
>> phone: +44 (0) 20 718 88364
>> email: alberto.gomez at kcl.ac.uk <mailto:alberto.gomez at kcl.ac.uk>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20100302/f6d152d6/attachment-0001.htm>
More information about the Insight-users
mailing list