[Insight-users] an expansion to LiverTumorSegmentation but with
visualization error
Luis Ibanez
luis.ibanez at kitware.com
Sun Nov 21 13:15:11 EST 2004
Hi Diaoxianfen,
If you find that the visualization of your extracted subregion
is slanted, it means *again* that at leaset one of the image
dimensions is off by "1".
You would avoid this problem by using the RegionOfInterestImageFilter
http://www.itk.org/Insight/Doxygen/html/classitk_1_1RegionOfInterestImageFilter.html
instead of extracting the image manually as you are currently doing.
For a description on how to use this filter,
please look at the ITK Software Guide.
http://www.itk.org/ItkSoftwareGuide.pdf
Section 7.4, pdf-page 225.
The associated source code example can be found in
Insight/Examples/IO/
ImageReadRegionOfInterestWrite.cxx
Regards,
Luis
--------------------
diaoxianfen wrote:
> Hi Luis,
> Hope you will help me again.
> I want to use LiverTumorSegmentation to do segmentation.But I intend to
> extract a subregion and do segmentation on this subregion.
> By two times respond to LeftButtonPressEvent I register the region.For
> example, in different z-axial slices I click the left button and
> register the positions.Then the two position record a cuboid region.The
> functions as follows:
> // record a position in three dimensions
> void LiverTumorSegmentation::RecordStartPoint()
> {
> m_StartPoint[0] = int(saggitalViewSlider->value());
> m_StartPoint[1] = int(coronalViewSlider->value());
> m_StartPoint[2] = int(axialViewSlider->value());
>
> }
> //record another positon in three dimensions
> void LiverTumorSegmentation::RecordEndPoint()
> {
> m_EndPoint[0] = int(saggitalViewSlider->value());
> m_EndPoint[1] = int(coronalViewSlider->value());
> m_EndPoint[2] = int(axialViewSlider->value());
>
> }
>
> By calling the RecordStartPoint() and RecordEndPoint() function,we can
> get two three-dimensions points to define the interested region.
>
> //extract region
> void LiverTumorSegmentation::ExtractRegion()
> {
> typedef itk::Image<unsigned char ,3> OutputImageType;
> OutputImageType::Pointer m_ExtractedImage = OutputImageType::New();
> if(m_LoadedVolume)
> {
> OutputImageType::IndexType index;
> index[0]=m_StartPoint[0];
> index[1]=m_StartPoint[1];
> index[2]=m_StartPoint[2];
> if(m_LoadedVolume->GetLargestPossibleRegion().IsInside( index))
> {
> }
> else
> {
> fl_message("Index is out of largest region");
> }
> index[0]=m_EndPoint[0];
> index[1]=m_EndPoint[1];
> index[2]=m_EndPoint[2];
> if(m_LoadedVolume->GetLargestPossibleRegion().IsInside( index))
> {
> }
> else
> {
> fl_message("Index is out of largest region");
> }
>
> OutputImageType::IndexType tempIndex;
> if(m_StartPoint[0]<m_EndPoint[0])
> {
> tempIndex[0]=m_StartPoint[0];
> }
> else
> {
> tempIndex[0]=m_EndPoint[0];
> }
>
> if(m_StartPoint[1]<m_EndPoint[1])
> {
> tempIndex[1]=m_StartPoint[1];
> }
> else
> {
> tempIndex[1]=m_EndPoint[1];
> }
>
> if(m_StartPoint[2]<m_EndPoint[2])
> {
> tempIndex[2]=m_StartPoint[2];
> }
> else
> {
> tempIndex[2]=m_EndPoint[2];
> }
>
>
> OutputImageType::IndexType start;
> start[0] = 0;
> start[1] = 0;
> start[2] = 0;
>
> OutputImageType::SizeType size;
> size[0] = abs(m_EndPoint[0] - m_StartPoint[0]+1);
> size[1] = abs(m_EndPoint[1] - m_StartPoint[1]+1);
> size[2] = abs(m_EndPoint[2] - m_StartPoint[2]+1);
>
> OutputImageType::RegionType desiredRegion;
> desiredRegion.SetSize( size );
> desiredRegion.SetIndex( start );
>
> m_ExtractedImage->SetRegions(desiredRegion);
> m_ExtractedImage->Allocate();
>
> OutputImageType::SpacingType sp;
> sp=m_LoadedVolume->GetSpacing();
> m_ExtractedImage->SetSpacing(sp);
>
> double origin[3];
> origin[0] = m_LoadedVolume->GetOrigin()[0];
> origin[1] = m_LoadedVolume->GetOrigin()[1];
> origin[2] = m_LoadedVolume->GetOrigin()[2];
>
> double newOrigin[3];
> newOrigin[0] = origin[0]+sp[0]*tempIndex[0];
> newOrigin[1] = origin[1]+sp[1]*tempIndex[1];
> newOrigin[2] = origin[2]+sp[2]*tempIndex[2];
> m_ExtractedImage->SetOrigin(newOrigin);
> OutputImageType::IndexType pixelIndex;
> OutputImageType::IndexType corPixelIndex;
> OutputImageType::PixelType pixelValue;
> for(int i=0;i<size[0];i++)
> {
> pixelIndex[0] = i;
> corPixelIndex[0] = i+tempIndex[0];
> for(int j=0;j<size[1];j++)
> {
> pixelIndex[1] = j;
> corPixelIndex[1] = j+tempIndex[1];
> for(int k=0;k<size[2];k++)
> {
> pixelIndex[2]=k;
> corPixelIndex[2]=k+tempIndex[2];
> pixelValue = m_LoadedVolume->GetPixel(corPixelIndex);
> m_ExtractedImage->SetPixel(pixelIndex,pixelValue);
>
> }
> }
> }
>
> }
>
>
> m_LoadedVolume = m_ExtractedImage;
>
> m_ShiftScaleImageFilter->SetInput( m_ITK2VTKAdaptor->GetOutput() );
>
> this->SetSegmentedVolumeOpacityControlOff();
>
> this->LoadPostProcessing();
>
> }
>
> In the LiverTumorSegmentation I added the "int m_StartPoint[3]" and "int
> m_EndPoint[3]".
>
> By these functions I get the interested region.But the display is
> still slantwise.I write the m_ExtractedImage to a MetaImage File.This
> file can be viewed by SNAP.
> Is there something wrong?Why the visualization is slant? I really need
> your help.
>
> Thanks
> Diaoxianfen
>
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Insight-users mailing list
> Insight-users at itk.org
> http://www.itk.org/mailman/listinfo/insight-users
More information about the Insight-users
mailing list