[Insight-users] Reading portion of image file

Bradley Lowekamp blowekamp at mail.nih.gov
Thu Mar 8 11:00:55 EST 2012


Hello Matthias,

You are correct that the documentation for the ImageFileReader::EnlargeOutputRequestedRegion should be updated. However only certain ImageIO file formats support the "stream" or roi reading. The one derived from the StreamingImageIO base along with nift, and maybe others support this functionality. You'd have to look at ImageIO to know for sure.

Your usage of the ImageFileReader->ExtactImageFilter was scenario to motivate for the recent optimization of making the Extract filter run InPlace. That is very nice usage!

It looks like you have encountered a bug. Most likely some one is not closing a file, and you are running out of file descriptors for the process.


Here is the procedure for reporting a bug:
http://www.itk.org/Wiki/ITK/Procedure_for_Contributing_Bug_Fixes

If you have a "working" bit of code which exhibits the bug, that would help us reproduce the issue and should be included. This will help expedite the solution. If you have a patch to fix it even better.

I am suspicious that the new HDF5 ImageIO is not closing the file in the CanRead method.

Brad

On Mar 8, 2012, at 10:31 AM, Matthias Schneider wrote:

> Hi.
> 
> I'm trying to extract subregions of 2D image files. Ideally, I'd like to 
> read the required data only.
> In the ITK doc I came across the comment in
> itk::ImageFileReader::EnlargeOutputRequestedRegion() saying that:
> "ImageFileReader cannot currently read a portion of an image (since the 
> ImageIO objects cannot read a portion of an image)"
> 
> I'm not quite sure if this still holds. After a quick experiment, I was 
> pretty much confident that the readers are in fact able to read portions:
> 
> const std::string fname = "/path/to/my/image.nii"; // [2048x2048 px]
> typedef itk::Image<Pixel8uType, 2> ImageType;
> typedef itk::ImageFileReader<ImageType> ReaderType;
> 
> ImageType::RegionType roi;
> roi.SetSize(0, 512);
> roi.SetSize(1, 512);
> 
> for (int i = 0; i < N; ++i) {
>   std::cout << i << std::endl;
>   ReaderType::Pointer reader = ReaderType::New();
>   reader->SetFileName(fname);
>   reader->GetOutput()->SetRequestedRegion(roi);
>   reader->Update();
> }
> 
> At first glance, this works perfectly fine (I checked the buffered data 
> chunk) and runs much faster than reading the entire slice. Choosing N 
> very large (say 1024), the program crashes since the reader seems to not 
> close the file descriptors properly. I get the following error:
> 
> HDF5-DIAG: Error detected in HDF5 (1.8.7) thread 0:
>   #000: [...]/ITK/Modules/ThirdParty/HDF5/src/itkhdf5/src/H5F.c line 
> 794 in H5Fis_hdf5(): unable to open file
>     major: Low-level I/O
>     minor: Unable to initialize object
>   #001: [...]/ITK/Modules/ThirdParty/HDF5/src/itkhdf5/src/H5FD.c line 
> 1086 in H5FD_open(): open failed
>     major: Virtual File Layer
>     minor: Unable to initialize object
>   #002: [...]/ITK/Modules/ThirdParty/HDF5/src/itkhdf5/src/H5FDsec2.c 
> line 348 in H5FD_sec2_open(): unable to open file: name = 
> '/path/to/my/image.nii', errno = 24, error message = 'Too many open 
> files', flags = 0, o_flags = 0
>     major: File accessability
>     minor: Unable to open file
> terminate called after throwing an instance of 
> 'itk::ImageFileReaderException'
>   what(): 
> [...]/ITK/Modules/IO/ImageBase/include/itkImageFileReader.hxx:143:
>  Could not create IO object for file /path/to/my/image.nii
> The file couldn't be opened for reading.
> Filename: /path/to/my/image.nii
> 
> 
> I also tried to explicitly use the ExtractImageFilter:
> 
> [... same as above ...]
> typedef itk::ExtractImageFilter<ImageType, ImageType> ExtractFilterType;
> 
> for (int i = 0; i < N; ++i) {
>   std::cout << i << std::endl;
>   ReaderType::Pointer reader = ReaderType::New();
>   reader->SetFileName(fname);
>   // reader->Update();
> 
>   ExtractFilterType::Pointer extractor =  ExtractFilterType::New();
>   extractor->SetInput(reader->GetOutput());
>   extractor->SetExtractionRegion(roi);
>   extractor->InPlaceOn(true);
>   extractor->Update();
> }
> 
> Without the reader->Update() the program still crashes when choosing N 
> sufficiently large (~1024). Updating the reader first of course reads 
> the entire slice (what I really want to avoid).
> So does this mean that the comment in the manual still holds and the 
> ImageIO is not able to correctly handle this case even though the 
> buffered data chunks are correctly imported?! This confuses me a bit or 
> maybe I'm missing something else?!
> 
> I'm happy about any comments or suggestions.
> 
> Thanks,
> Matthias
> _____________________________________
> 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.html
> 
> 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

========================================================
Bradley Lowekamp  
Medical Science and Computing for
Office of High Performance Computing and Communications
National Library of Medicine 
blowekamp at mail.nih.gov



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


More information about the Insight-users mailing list