[vtkusers] vtkPolyDataToImageStencil with partial volume

David Gobbi david.gobbi at gmail.com
Thu Feb 24 12:17:52 EST 2011


Hi Jonathan,

I still recommend that you add a vtkTransformPolyDataFilter like in the
ImageTracerWidget example.  Right now your image slice is right on the
top edge of the extruded contour, so the smallest amount of roundoff error
might cause it to miss.  By shifting the extruded contour up by half a voxel,
you can preemptively guard against such errors.

 - David


On Thu, Feb 24, 2011 at 10:09 AM, Jonathan Morra <jonmorra at gmail.com> wrote:
> Actually, after setting the marching squares value to 0.5 and changing the
> linear extrusion filter it's working now.  Thanks!!!
>
> On Thu, Feb 24, 2011 at 9:02 AM, Bill Lorensen <bill.lorensen at gmail.com>
> wrote:
>>
>> Also, the stencil algorithm and marching squares use different
>> criteria to determine whether a "pixel" is inside or outside.
>>
>> For the stencil, the pixel is considered a point and checked within a
>> tolerance for inside/outside. I'm guessing here).
>> For marching squares, a "square" is composed of four pixels. If at
>> least one of the four pixels is of the opposite state(inside/outside)
>> then a contour will be generated.
>>
>> On Thu, Feb 24, 2011 at 11:53 AM, Bill Lorensen <bill.lorensen at gmail.com>
>> wrote:
>> > Definitely set the isovalue to .5 if you have binary 0/1 images.
>> >
>> > On Wed, Feb 23, 2011 at 2:59 PM, David Gobbi <david.gobbi at gmail.com>
>> > wrote:
>> >> I've never used marching squares, but I have a guess as
>> >> to what the problem might be.  If your binary image has
>> >> values "0" and "1" then you should contour it at "0.5".
>> >>
>> >>  - David
>> >>
>> >>
>> >> On Wed, Feb 23, 2011 at 12:27 PM, Jonathan Morra <jonmorra at gmail.com>
>> >> wrote:
>> >>> If that's the case, then maybe I could have issues on the other side
>> >>> (converting binary images to contours, I do both).  For this I'm using
>> >>> vtkMarchingSquares followed by vtkStripper
>> >>> int[] extent = binaryOrgan.GetExtent();
>> >>>         switch (orientation) {
>> >>>             case OrthoPanel.ORIENTATION_XY:
>> >>>                 extent[4] = slice;
>> >>>                 extent[5] = slice;
>> >>>                 break;
>> >>>             case OrthoPanel.ORIENTATION_XZ:
>> >>>                 extent[2] = slice;
>> >>>                 extent[3] = slice;
>> >>>                 break;
>> >>>             case OrthoPanel.ORIENTATION_YZ:
>> >>>                 extent[0] = slice;
>> >>>                 extent[1] = slice;
>> >>>                 break;
>> >>>         }
>> >>> vtkMarchingSquares marching = new vtkMarchingSquares();
>> >>>         marching.SetInput(binaryOrgan);
>> >>>         marching.SetImageRange(extent);
>> >>>         marching.SetValue(0, 1);
>> >>>         marching.Update();
>> >>>         vtkPolyData marchingOutput = marching.GetOutput();
>> >>>         vtkStripper stripper = new vtkStripper();
>> >>>         stripper.SetInput(marchingOutput);
>> >>>         stripper.Update();
>> >>> Does anything look like it could be causing my issues there?
>> >>> On Wed, Feb 23, 2011 at 11:18 AM, David Gobbi <david.gobbi at gmail.com>
>> >>> wrote:
>> >>>>
>> >>>> The value "1e-6" is a common tolerance because it is larger than
>> >>>> most roundoff errors that are likely to occur in the calculations,
>> >>>> but still small enough that it won't appreciably increase size of the
>> >>>> region.
>> >>>>
>> >>>> Setting the tolerance to zero does exactly what you noted.  If the
>> >>>> pixel is exactly on the edge, then it is considered to be inside if
>> >>>> the
>> >>>> edge is a leading edge, or outside if the edge is a trailing edge.
>> >>>> This is done so that if you have two contours which are adjacent
>> >>>> (i.e. share an edge), the edge voxels will be considered to be in
>> >>>> just one of the two contours instead of in both.  If the tolerance is
>> >>>> set larger than zero, then the edge pixels would always be considered
>> >>>> to be in both contours.
>> >>>>
>> >>>> If you are dealing with rectangular contours, then the contour
>> >>>> lines should be made so that they lie halfway between pixels, instead
>> >>>> of lying directly on top of the pixels.  Then there is no uncertainty
>> >>>> about whether a pixel lies inside or outside.
>> >>>>
>> >>>>  - David
>> >>>>
>> >>>>
>> >>>> On Wed, Feb 23, 2011 at 11:58 AM, Jonathan Morra <jonmorra at gmail.com>
>> >>>> wrote:
>> >>>> > I had the tolerance set to 0, and setting it to 1e-6 didn't fix the
>> >>>> > problem.
>> >>>> >  How did you come up with that number?  What's wrong with setting
>> >>>> > it to
>> >>>> > 0?
>> >>>> >  In my case usually the left and top side of the vtkImageData is
>> >>>> > being
>> >>>> > eroded, such that if I call the filter many times, the vtkImageData
>> >>>> > will
>> >>>> > eventually be blank because it will all be eroded.   However,
>> >>>> > sometimes
>> >>>> > the
>> >>>> > bottom and right grow in size, I haven't figured out which
>> >>>> > situations
>> >>>> > cause
>> >>>> > which.
>> >>>> >
>> >>>> > On Wed, Feb 23, 2011 at 10:54 AM, David Gobbi
>> >>>> > <david.gobbi at gmail.com>
>> >>>> > wrote:
>> >>>> >>
>> >>>> >> Hi Jonathan,
>> >>>> >>
>> >>>> >> Whether a pixel is set depends on whether the center of the pixel
>> >>>> >> is inside or outside the contour, irregardless of what proportion
>> >>>> >> of
>> >>>> >> the pixel's volume is inside or outside.
>> >>>> >>
>> >>>> >> The only adjustment is the Tolerance, which should be set to
>> >>>> >> around 1e-6 so that pixels right on the edge of the contour
>> >>>> >> are considered to be inside.  The tolerance cannot be negative.
>> >>>> >>
>> >>>> >>  - David
>> >>>> >>
>> >>>> >>
>> >>>> >> On Wed, Feb 23, 2011 at 11:22 AM, Jonathan Morra
>> >>>> >> <jonmorra at gmail.com>
>> >>>> >> wrote:
>> >>>> >> > I am currently using vtkPolyDataToImageStencil to successfully
>> >>>> >> > convert
>> >>>> >> > contours represented as vtkPolyData to binary vtkImageData's.
>> >>>> >> >  However,
>> >>>> >> > I'm
>> >>>> >> > noticing a problem with the output sometimes.  Sometimes the
>> >>>> >> > resulting
>> >>>> >> > binary images are slightly smaller or slightly bigger than the
>> >>>> >> > poly
>> >>>> >> > data
>> >>>> >> > they were made from.  I assume this is the result of partial
>> >>>> >> > volume
>> >>>> >> > effects.
>> >>>> >> >  I would like to know 2 things
>> >>>> >> > 1.  How does vtkPolyDataToImageStencil handle partial volume.
>> >>>> >> > 2.  Is there a way to tune partial volume in
>> >>>> >> > vtkPolyDataToImageStencil?
>> >>>> >> >  For
>> >>>> >> > instance, a parameter which says if the contour includes less
>> >>>> >> > than x
>> >>>> >> > percentage of the pixel then that pixel is 0.
>> >>>> >> > Thanks,
>> >>>> >> > Jon
>> >>>> >> > PS If my assumption about partial volume effects is wrong,
>> >>>> >> > please let
>> >>>> >> > me
>> >>>> >> > know.
>> >>>> >> > _______________________________________________
>> >>>> >> > Powered by www.kitware.com
>> >>>> >> >
>> >>>> >> > Visit other Kitware open-source projects at
>> >>>> >> > http://www.kitware.com/opensource/opensource.html
>> >>>> >> >
>> >>>> >> > Please keep messages on-topic and check the VTK FAQ at:
>> >>>> >> > http://www.vtk.org/Wiki/VTK_FAQ
>> >>>> >> >
>> >>>> >> > Follow this link to subscribe/unsubscribe:
>> >>>> >> > http://www.vtk.org/mailman/listinfo/vtkusers
>> >>>> >> >
>> >>>> >> >
>> >>>> >
>> >>>> >
>> >>>
>> >>>
>> >> _______________________________________________
>> >> Powered by www.kitware.com
>> >>
>> >> Visit other Kitware open-source projects at
>> >> http://www.kitware.com/opensource/opensource.html
>> >>
>> >> Please keep messages on-topic and check the VTK FAQ at:
>> >> http://www.vtk.org/Wiki/VTK_FAQ
>> >>
>> >> Follow this link to subscribe/unsubscribe:
>> >> http://www.vtk.org/mailman/listinfo/vtkusers
>> >>
>> >
>
>



More information about the vtkusers mailing list