[vtkusers] Problem with vtkPolyDataToImageStencil in 5.8

Jothy jothybasu at gmail.com
Fri Mar 9 17:41:46 EST 2012


Thanks David, 

Finally there is a full stop for this problem. Now I can switch to VTK 5.8, this problem was preventing me to do this for the last few months!
Many of my core functionalities use this class. So this is very important for me to make sure this works as expected.


Cheers

Jothy


On 09-Mar-2012, at 10:26 PM, David Gobbi <david.gobbi at gmail.com> wrote:

> Hi Jothy,
> 
> Thanks for testing it without the extruder.  As the author of the
> class, I value feedback from users.  So if I ask a user to try
> something, and then they try it but don't tell me what the result
> was... it really doesn't help me to improve the class.
> 
> Yes, vtkPolyDataToImageStencil uses imageData->GetSpacing(),
> and when it is given contours directly (i.e. no extrusion), it expects
> the contours to also be separated from each other by this spacing.
> So you have to make sure that the spacing is the distance between
> the IPP of adjacent slices.  If the spacing is being set to the
> SliceThickness, that is wrong.
> 
> - David
> 
> 
> On Fri, Mar 9, 2012 at 3:16 PM, Jothy <jothybasu at gmail.com> wrote:
>> I tried but it did not work for this particular case. But it works perfectly without extrusion( as you said).
>> 
>> Since the imageData->GetSpacing() returns a wrong z spacing, vtkPolydstaToImageStencil may be using this wrong value somewhere internally.
>> 
>> Thanks
>> 
>> Jothy
>> 
>> 
>> 
>> On 09-Mar-2012, at 9:55 PM, David Gobbi <david.gobbi at gmail.com> wrote:
>> 
>>> Hi Jothy,
>>> 
>>> Please, for my sake, give it a try it without the extruder.  In VTK
>>> 5.8 the extruder should not be necessary, and removing it will make
>>> the process much more efficient.
>>> 
>>> If the DICOM reader is using the SliceThickness as the Z spacing,
>>> then it is wrong.  It is not uncommon for a protocol to use a slice
>>> thickness that is different from the Z spacing.
>>> 
>>> - David
>>> 
>>> 
>>> On Fri, Mar 9, 2012 at 2:26 PM, Jothybasu Selvaraj <jothybasu at gmail.com> wrote:
>>>> And vtkDICOMImageReader depends on the slice thickness tag it seems, that's
>>>> why the imageData->GetSpacing()
>>>> 
>>>> give 3.0 mm, which is wrong in this case.
>>>> 
>>>> Jothy
>>>> 
>>>> 
>>>> On Fri, Mar 9, 2012 at 9:24 PM, Jothybasu Selvaraj <jothybasu at gmail.com>
>>>> wrote:
>>>>> 
>>>>> Hi David,
>>>>> 
>>>>> Some stunning revelation here!
>>>>> 
>>>>> The problem is because of the inconsistence between the DICOM tags Slice
>>>>> thickness and ImagePositionPatient
>>>>> 
>>>>> Slice thickness says it's 3mm, but the z difference between two slices
>>>>> according to their IPP is 2.5 mm.
>>>>> 
>>>>> If I set the extrude->SetVector(0,0,-2.5).
>>>>> 
>>>>> It works perfectly!
>>>>> 
>>>>> How can it happen in DICOM? Probably, that's the reason why other datasets
>>>>> worked form me with the new vtkPolydataToImageStencil.
>>>>> 
>>>>> Can someone shed light on this?
>>>>> 
>>>>> Many thanks again
>>>>> 
>>>>> Jothy
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> On Fri, Mar 9, 2012 at 8:36 PM, David Gobbi <david.gobbi at gmail.com> wrote:
>>>>>> 
>>>>>> Hi Jothy,
>>>>>> 
>>>>>> Remove the extrude filter from the pipeline.
>>>>>> 
>>>>>>  - David
>>>>>> 
>>>>>> 
>>>>>> On Fri, Mar 9, 2012 at 1:29 PM, Jothybasu Selvaraj <jothybasu at gmail.com>
>>>>>> wrote:
>>>>>>> Hi David,
>>>>>>> 
>>>>>>> I am still not able to fix this issue.
>>>>>>> 
>>>>>>> This is how I create the polydata and other pipeline.
>>>>>>> 
>>>>>>> vtkSmartPointer<vtkPoints> points =
>>>>>>> 
>>>>>>>                        vtkSmartPointer<vtkPoints>::New();
>>>>>>> 
>>>>>>>                  vtkSmartPointer<vtkCellArray> cells =
>>>>>>> 
>>>>>>>                          vtkSmartPointer<vtkCellArray>::New();
>>>>>>> 
>>>>>>>                points->SetNumberOfPoints(npts+1);
>>>>>>> 
>>>>>>>                cells->InsertNextCell(npts+1);
>>>>>>> 
>>>>>>>                for(int p=0;p<npts;p++)
>>>>>>> 
>>>>>>>                {
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>>                    points->SetPoint( p, Xp, Yp,Zp );
>>>>>>> 
>>>>>>>                    cells->InsertCellPoint( p );
>>>>>>> 
>>>>>>>                }
>>>>>>> 
>>>>>>>                cells->InsertCellPoint(npts);
>>>>>>> 
>>>>>>>                points->SetPoint(npts,pts[0],pts[1],pts[2]);//close
>>>>>>> contour
>>>>>>> 
>>>>>>> 
>>>>>>>                vtkSmartPointer<vtkPolyData>polydataContour=
>>>>>>> 
>>>>>>>                        vtkSmartPointer<vtkPolyData>::New();
>>>>>>> 
>>>>>>>                polydataContour->Initialize();
>>>>>>> 
>>>>>>>                polydataContour->SetLines(cells);
>>>>>>> 
>>>>>>>                polydataContour->SetPoints(points);
>>>>>>> 
>>>>>>> 
>>>>>>> //Here all contours are appended to vtkAppendPolydataFilter
>>>>>>> 
>>>>>>>                vtkSmartPointer<vtkPolyDataToImageStencil> sts=
>>>>>>> 
>>>>>>>  vtkSmartPointer<vtkPolyDataToImageStencil>::New();
>>>>>>>               sts->SetTolerance(1e-6);//very important
>>>>>>>                sts->SetInformationInput(binary_image);
>>>>>>>                vtkSmartPointer<vtkLinearExtrusionFilter> extrude=
>>>>>>> 
>>>>>>>  vtkSmartPointer<vtkLinearExtrusionFilter>::New();
>>>>>>>                extrude->SetInput(appender->GetOutput());
>>>>>>>                extrude->CappingOff();//also tried ON
>>>>>>>                extrude->SetVector(0, 0,-zSpacing);//Correct Z spacing
>>>>>>> is
>>>>>>> important
>>>>>>>                //qDebug()<<-zSpacing<<"-ve zSpacing";
>>>>>>>                sts->SetInput(extrude->GetOutput());
>>>>>>> 
>>>>>>> 
>>>>>>>                //qDebug()<<t->currentTime()<<"Stencil start";
>>>>>>>                vtkSmartPointer<vtkImageStencil> stencil=
>>>>>>>                        vtkSmartPointer<vtkImageStencil>::New();
>>>>>>>                stencil->SetStencil(sts->GetOutput());
>>>>>>>                stencil->SetInput(binary_image);
>>>>>>>                stencil->ReverseStencilOn();
>>>>>>>                stencil->Update();
>>>>>>> 
>>>>>>> 
>>>>>>> I am able to visualize the contour by setting appendFilter->GetOutput()
>>>>>>> to a
>>>>>>> vtkPolyDataMapper.
>>>>>>> 
>>>>>>> Is there any thing wrong.
>>>>>>> 
>>>>>>> Thanks very much!
>>>>>>> 
>>>>>>> Jothy
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> On Tue, Mar 6, 2012 at 3:48 PM, David Gobbi <david.gobbi at gmail.com>
>>>>>>> wrote:
>>>>>>>> 
>>>>>>>> You'd have to use SetLines() instead of SetPolys().  And for
>>>>>>>> polylines, the final point in the polyline has to connect to the first
>>>>>>>> line to create a closed loop, so polylines cell arrays need an extra
>>>>>>>> entry as compared to polygon cell arrays.
>>>>>>>> 
>>>>>>>> On Tue, Mar 6, 2012 at 8:36 AM, Jothybasu Selvaraj
>>>>>>>> <jothybasu at gmail.com>
>>>>>>>> wrote:
>>>>>>>>> I ma creating the polydat per conoutr like this
>>>>>>>>> 
>>>>>>>>> vtkSmartPointer<vtkPolyData>polydataContour=
>>>>>>>>> 
>>>>>>>>>      vtkSmartPointer<vtkPolyData>::New();
>>>>>>>>> 
>>>>>>>>> polydataContour->Initialize();
>>>>>>>>> 
>>>>>>>>> polydataContour->SetPolys( cells );//vtkCellArray
>>>>>>>>> 
>>>>>>>>> polydataContour->SetPoints( points);//vtkPoints
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> How should I do that?
>>>>>>>>> 
>>>>>>>>> Thanks very much
>>>>>>>>> 
>>>>>>>>> Jothy
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> On Tue, Mar 6, 2012 at 3:31 PM, David Gobbi <david.gobbi at gmail.com>
>>>>>>>>> wrote:
>>>>>>>>>> 
>>>>>>>>>> The contours must be polylines, not polygons, or it won't work.
>>>>>>>>>> 
>>>>>>>>>> On Tue, Mar 6, 2012 at 6:29 AM, Jothybasu Selvaraj
>>>>>>>>>> <jothybasu at gmail.com>
>>>>>>>>>> wrote:
>>>>>>>>>>> Yes, I have one contour for each z slice as a vtkPolyData. I will
>>>>>>>>>>> try
>>>>>>>>>>> removing that.
>>>>>>>>>>> 
>>>>>>>>>>> Thanks
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> On Tue, Mar 6, 2012 at 1:26 PM, David Gobbi
>>>>>>>>>>> <david.gobbi at gmail.com>
>>>>>>>>>>> wrote:
>>>>>>>>>>>> 
>>>>>>>>>>>> Do you have one contour for each Z slice?  If so, then try
>>>>>>>>>>>> removing
>>>>>>>>>>>> the Extrude filter from your pipeline.
>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>>>> On Tue, Mar 6, 2012 at 2:51 AM, Jothybasu Selvaraj
>>>>>>>>>>>> <jothybasu at gmail.com>
>>>>>>>>>>>> wrote:
>>>>>>>>>>>>> Another point here,
>>>>>>>>>>>>> 
>>>>>>>>>>>>> I am creating a vtkPolyData for each contour and then adding
>>>>>>>>>>>>> it to
>>>>>>>>>>>>> the
>>>>>>>>>>>>> vtkAppendPolydataFilter, then the output of
>>>>>>>>>>>>> vtkAppenPolydataFilter
>>>>>>>>>>>>> is
>>>>>>>>>>>>> set as
>>>>>>>>>>>>> input to vtkPolydataToImageStencil.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Could this make any difference?
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Thanks
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Jothy
>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>> On Mon, Mar 5, 2012 at 7:49 PM, Jothybasu Selvaraj
>>>>>>>>>>>>> <jothybasu at gmail.com>
>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> No, it doesn't fix the problem.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> But it seems to work fine for contours with z-spacing in
>>>>>>>>>>>>>> steps of
>>>>>>>>>>>>>> 1mm.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> It is working well for a dataset with 3mm spacing but fails
>>>>>>>>>>>>>> for
>>>>>>>>>>>>>> 2.5
>>>>>>>>>>>>>> mm.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> Maybe I need to test it thoroughly. Can I use those cxx and
>>>>>>>>>>>>>> .h
>>>>>>>>>>>>>> from
>>>>>>>>>>>>>> 5.6
>>>>>>>>>>>>>> in
>>>>>>>>>>>>>> 5.8, that would be a easy workaround.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> Thanks
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> Jothy
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> On Mon, Mar 5, 2012 at 4:01 PM, David Gobbi
>>>>>>>>>>>>>> <david.gobbi at gmail.com>
>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> Hi Jothy,
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> It underwent significant changes, but the only change I can
>>>>>>>>>>>>>>> think
>>>>>>>>>>>>>>> of that might have affected your pipeline is the way that it
>>>>>>>>>>>>>>> does
>>>>>>>>>>>>>>> rounding, it used to use a Floor() method that provided a
>>>>>>>>>>>>>>> small
>>>>>>>>>>>>>>> tolerance even if you did SetTolerance(0).  Try calling
>>>>>>>>>>>>>>> SetTolerance(1e-6) on your PolyDataToImageStencil object, it
>>>>>>>>>>>>>>> might help.
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>  - David
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> On Mon, Mar 5, 2012 at 3:17 AM, Jothybasu Selvaraj
>>>>>>>>>>>>>>> <jothybasu at gmail.com>
>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>> Hi all,
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> I was able to create a mesh using the following pipeline
>>>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>> 5.6
>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>> it
>>>>>>>>>>>>>>>> worked well
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> vtkPolyDataToImageStencil->vtkLinearExtrusionFilter->vtkImageStencil->vtkDiscreteMarchingCubes
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> Now, I have updated vtk to 5.8 and I am getting gaps in
>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>> mesh
>>>>>>>>>>>>>>>> along
>>>>>>>>>>>>>>>> the z
>>>>>>>>>>>>>>>> axis. I am really puzzled, I have tried with different
>>>>>>>>>>>>>>>> data
>>>>>>>>>>>>>>>> sets
>>>>>>>>>>>>>>>> as
>>>>>>>>>>>>>>>> well.
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> I have read somewhere that vtkPolyDataToImageStencil had
>>>>>>>>>>>>>>>> some
>>>>>>>>>>>>>>>> changes
>>>>>>>>>>>>>>>> in
>>>>>>>>>>>>>>>> 5.8, does it has anything to do with this problem, or am I
>>>>>>>>>>>>>>>> doing
>>>>>>>>>>>>>>>> anything wrong?
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> I have contours of constant z-spacing.
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> Any hints?
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> Thanks
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>> Jothy
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> --
>>>>>>>>>>>>>> Jothy
>>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>> --
>>>>>>>>>>>>> Jothy
>>>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> --
>>>>>>>>>>> Jothy
>>>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> --
>>>>>>>>> Jothy
>>>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> --
>>>>>>> Jothy
>>>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> --
>>>>> Jothy
>>>>> 
>>>> 
>>>> 
>>>> 
>>>> --
>>>> Jothy
>>>> 



More information about the vtkusers mailing list