[Insight-users] I want to segment blood vessels from a series of picture with ITK , please help me

Bradley Lowekamp blowekamp at mail.nih.gov
Wed Aug 7 19:58:57 EDT 2013


Hello,

Unfortunately the HessianRecursiveGaussianImageFilter is not streamable.

I implemented a discrete Hessian filter and mad a couple composite filters with a gaussian convolution filters. I have not used it recently, so I'd write a test to verify it works. But it available in the ITKv4 remote/external module framework to easily be added.

https://github.com/blowekamp/itkLocalDiscreteHessian/tree/master/include

Good luck streaming is rather tricky.

Brad

On Aug 7, 2013, at 5:54 PM, Matt McCormick <matt.mccormick at kitware.com> wrote:

> Hi zhq,
> 
> To stream, the StreamingImageFilter must come at the end of the pipeline, and intermediate calls to Update() should be avoided.  Here is an example [1].
> 
> Please keep messages on the list.
> 
> Thanks,
> Matt
> 
> [1] http://itk.org/ITKExamples/src/Core/Common/StreamAPipeline/Documentation.html
> 
> On Sun, Aug 4, 2013 at 2:04 AM, zhq <15891495523 at 126.com> wrote:
> Hello  :
>        I have tried the StreamingImageFilter , it doesn't work ! The MR files are attached to the email (contains 50 files). And my code is :
> (I want to know where is the problem at all ! I'm going mad . )
> //use the itkHessian3DToVesselnessMeasureImageFilter method to segment
> //bright blood vessel
> #include "itkImage.h"
> #include "itkImageSeriesReader.h"
> #include "itkImageFileWriter.h"
> #include "itkNumericSeriesFileNames.h"
> #include "itkGDCMImageIO.h"
> #include <Windows.h>
> #include "itkShiftScaleImageFilter.h"
> #include "itkHessianRecursiveGaussianImageFilter.h"
> #include "itkHessian3DToVesselnessMeasureImageFilter.h"
> #include "itkStreamingImageFilter.h"
> void main()
> {
> 	typedef unsigned short PixelType ; 
> 	const unsigned int Dimension = 3; 
> 	typedef itk::Image<PixelType , Dimension> ImageType ; 
> 	typedef itk::ImageSeriesReader<ImageType> ReaderType ; 
> 	//there still some parameters can be set
> 	typedef itk::NumericSeriesFileNames NameGeneratorType ;
> 	NameGeneratorType::Pointer nameGenerator = NameGeneratorType::New();
> 	nameGenerator->SetSeriesFormat("C:\\Users\\zhq\\Desktop\\data\\SNAP_CR\\E403434298\\E403434298S1901I%3d.dcm");
> 	nameGenerator->SetStartIndex(301);
> 	nameGenerator->SetEndIndex(344);
> 	nameGenerator->SetIncrementIndex(1);
> 	
> 	ReaderType::Pointer reader = ReaderType::New();
> 	reader->SetImageIO(itk::GDCMImageIO::New());
> 	reader->SetFileNames(nameGenerator->GetFileNames());
> 	
> 	reader->Update();
> 	std::cout<<"reader updata"<<std::endl;
> 
> 	typedef itk::StreamingImageFilter<ImageType,ImageType> StreamFilterType ; 
> 	StreamFilterType::Pointer StreamFilter = StreamFilterType::New();
> 	StreamFilter->SetInput(reader->GetOutput());
> 	StreamFilter->SetNumberOfStreamDivisions(10);
> 	StreamFilter->Update();
> 
> 	typedef itk::Image<double,3> doubleImageType ; 
> 	typedef itk::ShiftScaleImageFilter<ImageType,doubleImageType> ShiftFilter ; 
> 	ShiftFilter::Pointer filter = ShiftFilter::New();
> 	filter->SetInput(StreamFilter->GetOutput());
> 	filter->Update();
> 	std::cout<<"filter updata"<<std::endl ; 
> 
> 	typedef itk::HessianRecursiveGaussianImageFilter<doubleImageType> HessianFilterType;
> 	HessianFilterType::Pointer hessianFilter = HessianFilterType::New();
> 	hessianFilter->SetInput(filter->GetOutput());
> 	hessianFilter->Update();
> 	std::cout<<"hessian Filter"<<std::endl ; 
> 
> //if read 45 files , there is a error 	
> 	typedef itk::Hessian3DToVesselnessMeasureImageFilter<float> VesselMeasureFilterType ; 
> 	VesselMeasureFilterType::Pointer vesselFilter = VesselMeasureFilterType::New();
> 	vesselFilter->SetInput(hessianFilter->GetOutput());
> 	vesselFilter->Update();
> 	std::cout<<"vesselFilter update"<<std::endl;
> 
> 	typedef itk::ImageFileWriter< itk::Image<float,3> > WriterType ; 
> 	WriterType::Pointer writer = WriterType::New();
> 	writer->SetInput(vesselFilter->GetOutput());
> 	writer->SetFileName("C:\\Users\\zhq\\Desktop\\Hessiandata.vtk");
> 	writer->Update();
> 	std::cout<<"writer updata"<<std::endl ;
> 
> 	system("pause");
> }
> 
> 
> 
> 
> 
> At 2013-08-04 05:05:33,"Matt McCormick" <matt.mccormick at kitware.com> wrote:
> Hi zhq,
> 
> It may be that you are running out of memory.  If that is the case, streaming can be applied to process the image in small chunks.  This can be achived with the StreamingImageFilter [1] or SetNumberOfStreamDivisions [2] on ImageFileWriter.
> 
> Thanks,
> Matt
> 
> [1] http://www.itk.org/Doxygen/html/classitk_1_1StreamingImageFilter.html
> [2] http://www.itk.org/Doxygen/html/classitk_1_1ImageFileWriter.html#a3dc8330ca50ef60844a15c1a81cc6ade
> 
> On Fri, Aug 2, 2013 at 8:46 PM, zhq <15891495523 at 126.com> wrote:
> Hello :
>      I must make an apology for my yesterday email . 
>      With referencing to the [1] , I can successfully segment blood vessels . Thank you very much . Although the result isn't very well , it help me a lot . 
>      But , there still a problem . I have 100 dicom files , and I thought read 100 files , and then segment those files . But , if I read more then 43 files , an error happened . 
>      My code and the error are shown as follow .
> <4.jpg>
> my code :
> //use the itkHessian3DToVesselnessMeasureImageFilter method to segment
> //bright blood vessel
> #include "itkImage.h"
> #include "itkImageSeriesReader.h"
> #include "itkImageFileWriter.h"
> #include "itkNumericSeriesFileNames.h"
> #include "itkGDCMImageIO.h"
> #include <Windows.h>
> #include "itkShiftScaleImageFilter.h"
> #include "itkHessianRecursiveGaussianImageFilter.h"
> #include "itkHessian3DToVesselnessMeasureImageFilter.h"
> void main()
> {
> 	typedef unsigned short PixelType ; 
> 	const unsigned int Dimension = 3; 
> 	typedef itk::Image<PixelType , Dimension> ImageType ; 
> 	typedef itk::ImageSeriesReader<ImageType> ReaderType ; 
> 	//there still some parameters can be set
> 	typedef itk::NumericSeriesFileNames NameGeneratorType ;
> 	NameGeneratorType::Pointer nameGenerator = NameGeneratorType::New();
> 	nameGenerator->SetSeriesFormat("C:\\Users\\zhq\\Desktop\\data\\SNAP_CR\\E403434298\\E403434298S1901I%3d.dcm");
> 	nameGenerator->SetStartIndex(301);
> 	nameGenerator->SetEndIndex(350);
> 	nameGenerator->SetIncrementIndex(1);
> 	
> 	ReaderType::Pointer reader = ReaderType::New();
> 	reader->SetImageIO(itk::GDCMImageIO::New());
> 	reader->SetFileNames(nameGenerator->GetFileNames());
> 	reader->Update();
> 	std::cout<<"reader updata"<<std::endl;
> 
> 	typedef itk::Image<double,3> doubleImageType ; 
> 	typedef itk::ShiftScaleImageFilter<ImageType,doubleImageType> ShiftFilter ; 
> 	ShiftFilter::Pointer filter = ShiftFilter::New();
> 	filter->SetInput(reader->GetOutput());
> 	filter->Update();
> 	std::cout<<"filter updata"<<std::endl ; 
> 
> 	typedef itk::HessianRecursiveGaussianImageFilter<doubleImageType> HessianFilterType;
> 	HessianFilterType::Pointer hessianFilter = HessianFilterType::New();
> 	hessianFilter->SetInput(filter->GetOutput());
> 	hessianFilter->Update();
> 	std::cout<<"hessian Filter"<<std::endl ; 
> //if read 44 files , there is a error 	
> 	typedef itk::Hessian3DToVesselnessMeasureImageFilter<float> VesselMeasureFilterType ; 
> 	VesselMeasureFilterType::Pointer vesselFilter = VesselMeasureFilterType::New();
> 	vesselFilter->SetInput(hessianFilter->GetOutput());
> 	vesselFilter->Update();
> 	std::cout<<"vesselFilter update"<<std::endl;
> 
> 	typedef itk::ImageFileWriter< itk::Image<float,3> > WriterType ; 
> 	WriterType::Pointer writer = WriterType::New();
> 	writer->SetInput(vesselFilter->GetOutput());
> 	writer->SetFileName("C:\\Users\\zhq\\Desktop\\mydata.vtk");
> 	writer->Update();
> 	std::cout<<"writer updata"<<std::endl ;
> 
> 	system("pause");
> }
> 
> 
> 
> 
> 
> 
> At 2013-08-02 11:24:29,"Matt McCormick" <matt.mccormick at kitware.com
> 
> 
> > wrote:
> >Hi,
> >
> >Here[1] is a very simple brain vessel segmentation example.
> >
> >For more advanced vessel segmentation methods, you may want to try
> >TubeTK[2], which supports analysis and visualization with the ITK and
> >VTK based 3DSlicer[3].
> >
> >Thanks,
> >Matt
> >
> >[1] http://itk.org/ITKExamples/src/Filtering/ImageFeature/SegmentBloodVessels/Documentation.html
> 
> 
> 
> >[2] http://tubetk.org/
> >[3] http://slicer.org/
> >
> >On Fri, Jul 26, 2013 at 9:19 PM, 章强 <15891495523 at 126.com> wrote:
> >> Hello :
> >>       there is a series of dcm format files which is the results of scanning
> >> the brain . I want to segment blood vessels from these files with ITK , and
> >> show it with VTK . Please give me a simple case . I have a  problem with
> >> this project .
> >>       how can I segment a specified region ? I know that ITK provide some
> >> segmentation algorithm  , but they need the Index of seeds . Can I show the
> >> picture with VTK fristly ,and then point out a seed in the picture ? And if
> >> there are some algorithms which can segment volume data ?
> >>
> >>
> >> 来自网易手机号码邮箱了解更多
> >>
> >> _____________________________________
> >> Powered by www.kitware.com
> >>
> >> Visit other Kitware open-source projects at
> >> http://www.kitware.com/opensource/opensource.html
> >>
> >> Kitware offers ITK Training Courses, for more information visit:
> >> http://www.kitware.com/products/protraining.php
> >>
> >> Please keep messages on-topic and check the ITK FAQ at:
> >> http://www.itk.org/Wiki/ITK_FAQ
> >>
> >> Follow this link to subscribe/unsubscribe:
> >> http://www.itk.org/mailman/listinfo/insight-users
> >>
> 
> 
> 来自网易手机号码邮箱了解更多
> 
> 
> 
> 来自网易手机号码邮箱了解更多
> 
> _____________________________________
> Powered by www.kitware.com
> 
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
> 
> Kitware offers ITK Training Courses, for more information visit:
> http://www.kitware.com/products/protraining.php
> 
> Please keep messages on-topic and check the ITK FAQ at:
> http://www.itk.org/Wiki/ITK_FAQ
> 
> Follow this link to subscribe/unsubscribe:
> http://www.itk.org/mailman/listinfo/insight-users

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20130807/f43e7841/attachment.htm>


More information about the Insight-users mailing list