[Insight-users] 3D Segmentation Mask

Cameron Burnett w_e_b_m_a_s_t_e_r_6_9 at hotmail.com
Fri May 9 07:59:33 EDT 2008


Thanks Luis, that almost worked. I was concentrating so much on the box widget I didn't really think to change the seed point.

The problem now is seen in the following 2 pictures.

This is the dicom object I get from the box widget mask. IE: the area that I want to segment..... http://img169.imageshack.us/img169/1506/femurunsegmentedjx1.jpg
And this is the result.... http://img254.imageshack.us/img254/2503/femursegmenteden8.jpg

You can see that the result is actually not quite the area that we were after. Its moved up in the +Z direction so that most of the femur is actually cut off. I'm almost certain that this is because the Z axis is flipped or something similar. But why? One would presume that the TransformPhysicalPointToIndex function would give the correct index even if the Z axis was somehow the wrong way around, right?

Naturally, I just changed the Z starting point to start on the other side.....

 start[2] = 512 - start[2];   // hardcoded 512 as a test     
 size[2] = start[2]-end[2];  //changed from size[2] = end[2]-start[2];

.... however the program just crashed when I did that.


I'm wondering if this problem is a bug, because it seems really strange to me that the points don't translate properly. Do you think it might be, or is it just another simple fix that I'm overlooking??

Thanks.



> Date: Wed, 7 May 2008 12:01:49 -0400
> From: luis.ibanez at kitware.com
> To: w_e_b_m_a_s_t_e_r_6_9 at hotmail.com
> CC: insight-users at itk.org
> Subject: Re: [Insight-users] 3D Segmentation Mask
> 
> 
> 
> Hi Cameron,
> 
> 
> Your suspicion is probably right,
> 
> 
> If you have the following pipeline:
> 
> 
>     reader-->ROIFilter-->RegionGrow
> 
> 
> and you feed the RegionGrowing filter
> with seed points whose index coordinates
> have been taken from the input image of
> the ROIFilter, then those indices can
> easily be outside of the extent of the
> image used in the RegionGrow filter.
> 
> 
> For example,
> 
> if the input image has a region:
> 
>     Index Start:   0,   0,   0
>     Size:        512, 512, 200
> 
> and you extract the ROI;
> 
>     Index Start: 200, 200, 50
>     Size       : 100, 100, 100
> 
> you will end up with an image whose
> region is given by:
> 
>     Index Start:   0,   0,   0
>     Size:        100, 100, 100
> 
> the Origin coordinates will be computed in
> order to match the physical position of the
> index (200,200,50) in the input image.
> 
> 
> So... if you are picking the seed points
> from the input image you have to convert
> these indices to the range of the output
> image.
> 
> For example:
> 
>   Index picked in the input image:
> 
>          257, 234, 65
> 
>   should be converted to the ROI extracted
>   image by subtracting the origin of the
>   ROI
> 
>      257-200, 234-200, 65-50
> 
> to produce
> 
>          57, 34, 15
> 
> 
> You could also prevent crashes by testing
> the index before running the algorithm.
> 
> 
> For example:
> 
> roi->Update();
> if( roi->GetOutput()->GetBufferedRegion().IsInside( seed ) )
> {
>    regionGrowth->AddSeed( seed );
>    regionGrowth->Update();
> }
> else
> {
>   // error message
> }
> 
> 
> Note tha you must call Update() in the roi filter
> before you attempt to query its output image.
> 
> 
> Please let us know if you find any other problems,
> 
> 
>     Thanks
> 
> 
>       Luis
> 
> -----------------------
> Cameron Burnett wrote:
> > 
> > I've done a bit of testing to see where my problem is.
> > 
> > 1) The region that I've set up (to define the 
> > RegionOfInterestImageFilter) is definately within the input image range.
> > 2) The Confidence Connected seed point is definately within the defined 
> > region.
> > 
> > So in that regard everything seems perfect. Now I'm also getting another 
> > result where the program crashes, presumably because of a bad pixel 
> > index given to the Confidence Connected Filter....
> > 
> >  const InputRealType seedIntensity =
> >       static_cast<InputRealType>(inputImage->GetPixel( *si ));      
> > //crashes here in itkConfidenceConnectedImageFilter.txx
> > 
> > 
> > .... and so now I'm thinking that maybe the RegionOfInterestImageFilter 
> > has set up a whole new pixel index system, but my program is still using 
> > the old one perhaps?
> > 
> > Does this filter use the same pixel indices as the original image or 
> > does it create new ones within the new region?? Thats honestly the ONLY 
> > thing I can think of.
> > 
> > Thanks.
> > 
> > 
> > 
> > 
> > 
> >     ------------------------------------------------------------------------
> >     From: w_e_b_m_a_s_t_e_r_6_9 at hotmail.com
> >     To: w_e_b_m_a_s_t_e_r_6_9 at hotmail.com
> >     CC: insight-users at itk.org
> >     Subject: RE: [Insight-users] 3D Segmentation Mask
> >     Date: Tue, 6 May 2008 22:27:42 +1000
> > 
> >     Hi all,
> > 
> >     I've been working on my problem, and I fixed a few things but it
> >     still does nothing.
> > 
> >     The part that I changed is as follows. I had forgotten to change the
> >     physical coordinates to indices, so thats what I've done here. Its
> >     output is shown below the code.
> > 
> >     -------
> > 
> >     InternalImageType::Pointer image = reader->GetOutput();
> > 
> >       InternalImageType::PointType origin;
> >       origin[0] = 0.0;
> >       origin[1] = 0.0;
> >       origin[2] = 0.0;
> >       image->SetOrigin(origin);
> > 
> >         image->TransformPhysicalPointToIndex(startPt, start);
> >         image->TransformPhysicalPointToIndex(endPt, end);
> > 
> >       InternalImageType::SizeType size;
> >       size[0] = (int)end[0]-(int)start[0];
> >       size[1] = (int)end[1]-(int)start[1];
> >       size[2] = (int)end[2]-(int)start[2];
> > 
> >             CString v;
> >         v.Format("%i %i %i %i %i
> >     %i",start[0],start[1],start[2],size[0],size[1],size[2]);
> >         AfxMessageBox(v);
> > 
> >     ------
> > 
> >     The output of that last message box shows the start coords and the
> >     size coords. That outputs "239 179 229 134 68 51". Now to me that
> >     sounds fine. My image is 512 x 512 x 342 so its within that, and
> >     also the size is quite small, which is exactly what I did with my
> >     box widget.
> > 
> >     I'm not forgetting to refresh the screen or anything. All I have
> >     done is add this filter into the pipeline, and the rest is the same
> >     as when it worked previously with no masking.
> > 
> >     Anything obviously wrong with my code??
> > 
> >     Thanks,
> >     Cameron.
> > 
> > 
> > 
> >         ------------------------------------------------------------------------
> >         From: w_e_b_m_a_s_t_e_r_6_9 at hotmail.com
> >         To: luis.ibanez at kitware.com
> >         Date: Tue, 6 May 2008 00:24:10 +1000
> >         CC: insight-users at itk.org
> >         Subject: Re: [Insight-users] 3D Segmentation Mask
> > 
> >         Thanks for that info Luis.
> > 
> > 
> >         I implemented the box widget approach today and it seems to mask
> >         quite well, because the time it takes to run is drastically
> >         reduced. However I'm not actually getting anything to display on
> >         the screen.
> > 
> >         I'm using the ImageReadRegionOfInterestWrite example, and the
> >         key section of code is as follows.
> > 
> >         -------------------------------------------------------------------------
> > 
> >           vtkPolyData *poly = vtkPolyData::New();
> > 
> >           double bounds[6];
> >           for(int i=0; i<6; i++){bounds[i] = NULL;}
> > 
> >           boxWidget->GetPolyData(poly);
> >           poly->GetBounds(bounds);
> > 
> >         //then i set up the filter
> > 
> >           InternalImageType::IndexType start;
> >           start[0] = (int)bounds[0]; //xmin  
> >           start[1] = (int)bounds[2]; //ymin
> >           start[2] = (int)bounds[4]; //zmin
> > 
> >           InternalImageType::SizeType size;
> >           size[0] = (int)(bounds[1]-bounds[0]);   //xmax-xmin
> >           size[1] = (int)(bounds[3]-bounds[2]);  //etc...
> >           size[2] = (int)(bounds[5]-bounds[4]);
> > 
> >         //then i attach it all together, add it to the pipeline etc.
> > 
> >         --------------------------------------------------------------------------------
> > 
> >         I think my problem has something to do with the Start and Size
> >         indices. I'm not sure what i'm doing wrong though.
> > 
> > 
> >         Thanks for any further help,
> >         Cameron.
> > 
> > 
> > 
> > 
> >         ------------------------------------------------------------------------
> >          > Date: Wed, 30 Apr 2008 16:56:25 -0400
> >          > From: luis.ibanez at kitware.com
> >          > To: w_e_b_m_a_s_t_e_r_6_9 at hotmail.com
> >          > CC: insight-users at itk.org
> >          > Subject: Re: [Insight-users] 3D Segmentation Mask
> >          >
> >          > Hi Cameron,
> >          >
> >          > It seems that what you are looking for is a VTK interactive
> >          > method for selecting a region of interest of your 3D image,
> >          > that will be later passed to an ITK segmentation pipeline.
> >          >
> >          > Is that correct ?
> >          >
> >          > If so, one thing you could easily use is the
> >          >
> >          > vtkAffineWidget
> >          > http://www.vtk.org/doc/nightly/html/classvtkAffineWidget.html
> >          >
> >          > or the
> >          >
> >          > vtkBoxWidget
> >          > http://www.vtk.org/doc/nightly/html/classvtkBoxWidget.html
> >          >
> >          > or a combination of 3 ImagePlaneWidgets:
> >          > http://www.vtk.org/doc/nightly/html/classvtkImagePlaneWidget.html
> >          >
> >          >
> >          > That you will find the widgets under
> >          >
> >          >
> >          > VTK/Widgets/
> >          >
> >          >
> >          > You could interactively manipulate their handles until you have
> >          > captured the region of interest and then (programatically)
> >          > you could query the current state of the widget in order to
> >          > deduce the coordinates of its corners.
> >          >
> >          > The coordinate of the region of interest could then be passed
> >          > as a Region to the itkRegionOfInterestImageFilter.
> >          >
> >          >
> >          >
> >          >
> >          > Regards,
> >          >
> >          >
> >          > Luis
> >          >
> >          >
> >          >
> >          > ----------------------
> >          > Cameron Burnett wrote:
> >          > > Hi,
> >          > >
> >          > > Currently I'm trying to figure out how to create a mask for
> >          > > segmentation. The way i'm thinking of doing it is using a
> >          > > MaskImageFilter to mask my DICOM object with a vtkActor
> >         cube object that
> >          > > I generated just from points. To do that I need to figure
> >         out 1 of 2
> >          > > things (due to the fact that you can't plug an actor
> >         straight into the
> >          > > mask filter). Either I replace that vtkActor with some sort
> >         of ITK box
> >          > > primitive that can go straight into the filter, OR I
> >         somehow convert the
> >          > > object into the correct itk image form.
> >          > >
> >          > > Does that make sense?? Generally I just want to segment
> >         only the stuff
> >          > > inside a box that I can move around. That's the simple way
> >         of putting it.
> >          > >
> >          > > I was looking at this example in the Insight Applications
> >          > > "vtkPolyDataToITKMesh.cxx" , but I'm not sure thats what
> >         I'm after. Also
> >          > > I found a bit on the mailing list about
> >          > > "TriangleMeshToBinaryImageFilter" but that has just left me
> >         even more
> >          > > confused.
> >          > >
> >          > > Is there an easier way to create an
> >         interactive/movable/scaleable 3D
> >          > > mask, other than a cube represented by a vtkActor? What
> >         sort of stuff
> >          > > should I be looking to use for this approach (or a similar
> >         one) ??
> >          > >
> >          > > Thanks in advance,
> >          > > Cameron.
> >          > >
> >          > >
> >          > >
> >          > >
> >          > >
> >          > >
> >         ------------------------------------------------------------------------
> >          > > Click here Search for local singles online @ Lavalife.
> >          > >
> >         <http://a.ninemsn.com.au/b.aspx?URL=http%3A%2F%2Flavalife9%2Eninemsn%2Ecom%2Eau%2Fclickthru%2Fclickthru%2Eact%3Fid%3Dninemsn%26context%3Dan99%26locale%3Den%5FAU%26a%3D30290&_t=764581033&_r=email_taglines_Search_OCT07&_m=EXT>
> >          > >
> >          > >
> >          > >
> >         ------------------------------------------------------------------------
> >          > >
> >          > > _______________________________________________
> >          > > Insight-users mailing list
> >          > > Insight-users at itk.org
> >          > > http://www.itk.org/mailman/listinfo/insight-users
> > 
> >         ------------------------------------------------------------------------
> >         Find out: SEEK Salary Centre Are you paid what you're worth?
> >         <http://a.ninemsn.com.au/b.aspx?URL=http://ninemsn.seek.com.au/career-resources/salary-centre/?tracking%3Dsk:het:sc:nine:0:hot:text&_t=764565661&_r=OCT07_endtext_salary&_m=EXT>
> > 
> > 
> > 
> >     ------------------------------------------------------------------------
> >     Hotmail on your mobile. Never miss another e-mail with
> >     <http://www.livelife.ninemsn.com.au/article.aspx?id=343869> 
> > 
> > 
> > ------------------------------------------------------------------------
> > at CarPoint.com.au It's simple! Sell your car for just $30 
> > <http://a.ninemsn.com.au/b.aspx?URL=http%3A%2F%2Fsecure%2Dau%2Eimrworldwide%2Ecom%2Fcgi%2Dbin%2Fa%2Fci%5F450304%2Fet%5F2%2Fcg%5F801459%2Fpi%5F1004813%2Fai%5F859641&_t=762955845&_r=tig_OCT07&_m=EXT>
> > 
> > 
> > ------------------------------------------------------------------------
> > 
> > _______________________________________________
> > Insight-users mailing list
> > Insight-users at itk.org
> > http://www.itk.org/mailman/listinfo/insight-users

_________________________________________________________________
Are you paid what you're worth? Find out: SEEK Salary Centre
http://a.ninemsn.com.au/b.aspx?URL=http%3A%2F%2Fninemsn%2Eseek%2Ecom%2Eau%2Fcareer%2Dresources%2Fsalary%2Dcentre%2F%3Ftracking%3Dsk%3Ahet%3Asc%3Anine%3A0%3Ahot%3Atext&_t=764565661&_r=OCT07_endtext_salary&_m=EXT
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20080509/c043d85f/attachment-0001.htm>


More information about the Insight-users mailing list