[vtkusers] going from binary images to 2D contours

Mark Roden mmroden at gmail.com
Thu Mar 1 13:13:33 EST 2012


Hi David,

You're right, removing the stripper removed those errors.

The program is now quite a bit slower-- I suspect that the stripper
was causing some other code to be able to run faster.  That will
probably be my next question, once I get a profiler attached to this.

Thanks!
Mark

On Thu, Mar 1, 2012 at 7:44 AM, Mark Roden <mmroden at gmail.com> wrote:
> Hi David,
>
> Sorry, I made a mistake earlier; I'm using marching squares, not
> cubes-- but I am following it with the stripper, which I'll try
> removing now.  And if that doesn't work, I'll check the stripper
> output for single polylines per contours.
>
> Thanks for the starting point,
> Mark
>
> On Wed, Feb 29, 2012 at 9:03 PM, David Gobbi <david.gobbi at gmail.com> wrote:
>> From the image, the problem looks fairly obvious: the contour points
>> aren't in order, so when you draw lines between the points, you get
>> extra lines that cross the image.  So probably the most important
>> question is, what do you do, if anything, to make sure that the points
>> in the contours that you produce from the binary image are correctly
>> ordered?
>>
>> In your other email you mentioned vtkMarchingSquares, and in this
>> email you say you use vtkMarchingCubes (followed, I'm guessing, by
>> vtkCutter).  Then maybe you're using vtkStripper to try to get the
>> points into the correct order before saving them?  If you are using
>> vtkStripper, it looks like it is producing multiple polylines per
>> contour, when it should just be producing one polyline per contour.
>> This could be the result of numeric precision issues in vtkCutter
>> (given the choice, you should use vtkMarchingSquares on each slice,
>> rather than vtkMarchingCubes followed by cutter).
>>
>>  - David
>>
>>
>>
>>
>>
>> On Wed, Feb 29, 2012 at 9:17 PM, Mark Roden <mmroden at gmail.com> wrote:
>>> Hi David,
>>>
>>> Maybe I should just send you my data :)  I don't think that my problem
>>> has to do with being near boundaries, as my objects are away from the
>>> edges of the image (but not in z-- that's solved that by padding the
>>> image by a plane in either direction in z).
>>>
>>> The problem I'm having is that, somewhere along the way, the contours
>>> are being transformed from 'proper' contours, in the case of the
>>> larger mask, to ones with extra connections.
>>>
>>> The binarization is done via the process we discussed on the other
>>> thread; that is, the contour is binarized by first following that
>>> function to translate polygons to lines, then
>>> vtkPolyDataToImageStencil, then vtkImageStencil.  The reverse, from
>>> binary to contour (which actually appears on the image), is done by
>>> vtkMarchingCubes.  This output has extra lines.
>>>
>>> I would love to be able to intercept the binary mask in transit, but
>>> unfortunately, some way that I have vtkImageViewer2 set up isn't
>>> allowing me to see it.  However, you can see the body mask from the
>>> contour image 'body lines.png' I've attached, and then from the second
>>> overlay image 'body with strange lines.png' the extra lines on a
>>> single plane when overlaid with the data.
>>>
>>> Have you seen this kind of behavior before in either method?  That
>>> this behavior appeared either when I ran the old extrusion method or
>>> with the new line-based method suggests to me that it's a problem with
>>> the marching squares approach.  Hence my original question.
>>>
>>> Thanks,
>>> Mark
>>>
>>> On Wed, Feb 29, 2012 at 4:10 PM, David Gobbi <david.gobbi at gmail.com> wrote:
>>>> My own experience is that vtkMarchingSquares is the best way to
>>>> contour a 2D image.  It is the only 2D contouring filter I'm aware of
>>>> that correctly orients the contours, i.e. so that you can be sure what
>>>> is "inside" and what is "outside."
>>>>
>>>> But vtkMarchingSquares generates open contours whenever the contour
>>>> reaches the bounds of the image... that might be the cause of the
>>>> failures that you are seeing.  Because of this problem, I've written
>>>> my own version of marching squares that always produces closed
>>>> contours, you can find the code here:
>>>> https://github.com/dgobbi/ToolCursor/blob/master/vtkImageToROIContourData.cxx
>>>>
>>>>  - David
>>>>
>>>>
>>>> On Wed, Feb 29, 2012 at 4:43 PM, Mark Roden <mmroden at gmail.com> wrote:
>>>>> Hi all,
>>>>>
>>>>> After a length conversation over on the developer list, I've now got a
>>>>> very fast way to convert 2D contours from DICOM rtstructs into binary
>>>>> data.  Now I need to do the reverse.  I already have a method, but
>>>>> this approach is failing for large images-- and by 'failing', I mean
>>>>> producing contours that do not look like the binary data.
>>>>>
>>>>> I need contours in the xy, xz, and yz planes.  It's also possible to
>>>>> have multiple contours in any given plane.
>>>>>
>>>>> Right now, I'm using vtkMarchingSquares, but as I said, this is not
>>>>> working for larger contours, and produces spurious results.
>>>>>
>>>>> I note that there's also vtkContourFilter, vtkMarchingContourFilter,
>>>>> vtkSliceCubes, vtkImageMarchingCubes, etc.  Is there any reason to
>>>>> choose one of these over the other?  What would I need for my
>>>>> particular case?
>>>>>
>>>>> Thanks,
>>>>> Mark



More information about the vtkusers mailing list