[Insight-users] 3D level set segmentation
John Dailey
john.w.dailey at gmail.com
Fri Jul 18 11:36:34 EDT 2008
I am having problems with extending geodesic active contours to 3d as
well. I am fairly certain that my problems are related to how I try
to write the image out at the end of the pipeline.
I sent the following message to the list a few days ago, but I haven't
gotten any responses (actually no message I have sent to the list in
the last month has gotten any responses, I am starting to wonder if
there is something wrong with how I am sending to the list. Are you
folks getting my emails?)
Thanks,
John
<begin quoted message>
I am having some problems using the itkImageSeriesWriter. I am quite
certain that I must be setting things up wrong, or not understanding
what it is supposed to be used for, or something.
In debugging my 3d segmentation code, I realized that I can't even get
the image series writer to work (and that might be why my segmentation
isn't working).
I wrote a little code that runs the ImageSeriesReader, casts the pixel
type and then runs the ImageSeriesWriter (going to a different file
name). The code doesn't do anything (it should result in a copy of my
image series, right?), and I am hoping someone can help me figure out
why. One thing I noticed that I think might be relevant is that when
I just call update on the reader, or the caster instead of the writer,
the runtime of the code is much longer. Like it is reading the images
and casting them in the case where update is called on the caster
rather than the writer, where when it is called on the writer, the
code just returns...
Any ideas?
Thanks for helping me out, I am still trying to figure out how ITK works...
-John
Here is the program I wrote:
#include "itkImage.h"
#include "itkRescaleIntensityImageFilter.h"
#include <iostream>
#include <string>
#include "itkImageSeriesWriter.h"
#include "itkImageSeriesReader.h"
#include "itkNumericSeriesFileNames.h"
#include "itkPNGImageIO.h"
int main( int argc, char *argv[] )
{
if( argc < 4 )
{
std::cerr << "Missing Parameters " << std::endl;
std::cerr << "Usage: " << argv[0];
std::cerr << " inputImage outputImage #ofSlices" << std::endl;
return 1;
}
typedef float InternalPixelType;
const unsigned int Dimension = 3;
typedef itk::Image< InternalPixelType, Dimension > InternalImageType;
typedef unsigned char OutputPixelType;
typedef itk::Image< OutputPixelType, Dimension-1 > OutputImageType;
typedef itk::Image< OutputPixelType, Dimension > OutputSeriesType;
// We instantiate reader and writer types in the following lines.
//
typedef itk::NumericSeriesFileNames NameGeneratorType;
NameGeneratorType::Pointer nameGenerator = NameGeneratorType::New();
const std::string infilebase = argv[1];
const unsigned int first = 0;
const unsigned int last = atoi( argv[3] );
std::string seriesFormat = infilebase+"%03d.png";
nameGenerator->SetSeriesFormat(seriesFormat.c_str());
nameGenerator->SetStartIndex(first);
nameGenerator->SetEndIndex(last);
nameGenerator->SetIncrementIndex(1);
std::cout <<"seriesFormat:"<<seriesFormat.c_str()<<std::endl;
NameGeneratorType::Pointer outGenerator = NameGeneratorType::New();
const std::string outfilebase = argv[2];
std::string outFormat = outfilebase+"%03d.png";
outGenerator->SetSeriesFormat(outFormat.c_str());
outGenerator->SetStartIndex(first);
outGenerator->SetEndIndex(last);
outGenerator->SetIncrementIndex(1);
typedef itk::ImageSeriesReader< InternalImageType > ReaderType;
typedef itk::ImageSeriesWriter< OutputImageType, OutputSeriesType
> WriterType;
ReaderType::Pointer reader = ReaderType::New();
WriterType::Pointer writer = WriterType::New();
reader->SetImageIO(itk::PNGImageIO::New());
reader->SetFileNames(nameGenerator->GetFileNames());
writer->SetImageIO(itk::PNGImageIO::New());
writer->SetFileNames(outGenerator->GetFileNames());
typedef itk::RescaleIntensityImageFilter<
InternalImageType,
OutputImageType > CastFilterType;
CastFilterType::Pointer casterA = CastFilterType::New();
casterA->SetInput(reader->GetOutput() );
writer->SetInput( casterA->GetOutput() );
try
{
//casterA->Update();
writer->UpdateLargestPossibleRegion();
}
catch( itk::ExceptionObject & excep )
{
std::cerr << "Exception caught !" << std::endl;
std::cerr << excep << std::endl;
}
return 0;
}
<end quoted message>
On Fri, Jul 18, 2008 at 7:48 AM, Luca Antiga <luca.antiga at gmail.com> wrote:
> Dear Gokhan,
> geodesic active contours have been widely used even in large datasets
> (surely larger than the ones you're mentioning), provided you have enough
> memory available.
> One of two things may be happening:
> 1. you're not running out of memory and your operative system starts
> swapping on the virtual memory
> 2. there's a problem with the way you extended the code to 3D.
> The first point is easy to check (just look at a memory monitor or listen to
> the sounds emitted by your hard drive). For the second, you'll have to post
> a code snippet for us to take a look.
> Regards
>
> Luca
>
>
>
> On Jul 18, 2008, at 4:35 PM, Gokhan Mustafa Uzunbas wrote:
>
>> Dear ITK users I am tring to do a level set based segmentation using
>> GeodesicActiveContourImageFilter.cxx sample in ITK. 2D works fine but when I
>> try on 3D data I observed that fast marching filter can not initialize a
>> simple sphere although I gave seed points and radius. It gets in a while
>> loop in FastMarchingImageFilter to compute a signed distance function and
>> can not get out.
>> I do not know how much more I should wait but it seems it is not usable
>> when image dimensions are 500 x 500 x 25.
>> Are there anyone who could succeed to run those segmentation filters in
>> 3D?
>> If anyone could help or point me, please? Thank you in advance.
>>
>> Gokhan
>> _______________________________________________
>> Insight-users mailing list
>> Insight-users at itk.org
>> http://www.itk.org/mailman/listinfo/insight-users
>
> _______________________________________________
> 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