[Insight-users] Convert NRRD into DICOM

Bill Lorensen bill.lorensen at gmail.com
Sun Jul 5 08:19:27 EDT 2009


Luis,

I just verified that nrrd can only handle unix style "/" slashes in
filenames. It cannot handle windows "\" separators in filenames.

I looked quickly at the nrrd code and it's not obvious how to fix
this. However, I can easily fix the problem in itkNRRDImageIO.cxx by
using itksys::SystemTools::ConvertToUnixSlashes(). I tried this and
the test program now works with "\" in the filenames.

What do you think?

Bill

On Sun, Jul 5, 2009 at 7:50 AM, Bill Lorensen<bill.lorensen at gmail.com> wrote:
> I think I can reproduce the problem.
>
> I just ran itkIOTests itkNrrdImageReadWriteTest with one of the itk
> testing datasets. When I specified the name with forward slash
> separators, the test worked. When I specified with "\" backslash
> separators if failed.
>
> Ezequiel, Can you try this command line:
> C:\Projects\ConversionTool\build\Debug\ConvertIntoDicomSeries.exe
> C:/Downloads/MS-Lesion-Segmentation-2008/Testing-Data/CHB_test1_Part1/CHB_test1_Case01/CHB_test1_Case01_FLAIR.nhdr
> C:/Desktop/
>
> Bill
>
>
> On Sat, Jul 4, 2009 at 3:51 PM, Luis Ibanez<luis.ibanez at kitware.com> wrote:
>>
>> Hi Ezequiel,
>>
>> Thanks for the additional information.
>>
>> Your image of 512 x 512 x 512 short pixels
>> would require:
>>
>>
>>              256 Mb
>>
>>
>> which doesn't seem to be too demanding...
>>
>>
>> So...
>> your suspicion that the problem relates to locating
>> the file itself, sounds reasonable.
>>
>>
>>
>> A typical suspect would be the logic that constructs
>> the filename "fname".
>>
>>
>>
>> Could you please help us debug this problem ?
>>
>>
>> Please do the following:
>>
>>
>> Compile ITK and your program in Debug mode.
>>
>> Put a break point in
>>
>>    Insight/Utilities/NrrdIO/formatNRRD.c
>>
>> in line : 113:
>>
>>  fname = (char*)malloc(airStrlen(nio->path) + strlen("/") + maxl + 1);
>>
>> Then track the composition of "fname" through the
>> subsequent lines.
>>
>> Somewhere in between 113 and 160 there should be a logic
>> flaw on the construction of the raw data filename.
>>
>>
>> Pay particular attention to line 138-144:
>>
>>
>>    if (_NEED_PATH(nio->dataFNFormat)) {
>>      strcpy(fname, nio->path);
>>      strcat(fname, "/");
>>      sprintf(fname +
>>            strlen(nio->path) +
>>            strlen("/"), nio->dataFNFormat, ii);
>>    } else {
>>      sprintf(fname, nio->dataFNFormat, ii);
>>    }
>>
>>
>> (e.g. including whath
>> path of the "if" in line 138 the code is taking.
>>
>>
>> or whether the code enters the section 149-153:
>>
>>
>>    if (_NEED_PATH(nio->dataFN[nio->dataFNIndex])) {
>>      sprintf(fname, "%s/%s", nio->path, nio->dataFN[nio->dataFNIndex]);
>>    } else {
>>      strcpy(fname, nio->dataFN[nio->dataFNIndex]);
>>    }
>>
>>
>> Please let us know what you find to be the sequence
>> of lines (in the code) that your program follows when
>> constructing "fname".
>>
>>
>>
>>      Thanks
>>
>>
>>         Luis
>>
>>
>> ----------------------------
>> Ezequiel Geremia wrote:
>>>
>>> Hi,
>>>
>>>
>>> Thank you, I appreciate your support on this question.
>>>
>>>
>>> The images are volumes dimensions: ( 512, 512, 512 ) and pixel type is
>>> short.
>>>
>>>
>>> While trying to run the task manager with the ITK conversion executable
>>> there is no jump in RAM usage, this is why I think the RAW volume is not
>>> even loaded in memory, the reader just does not find it.
>>>
>>>
>>> My understanding is that there is no memory problem, indeed I manage to
>>> load the same image with the same executable just by moving to the directory
>>> containing the NRRD volumes.
>>>
>>>
>>> Many thanks,
>>>
>>>
>>> Ezequiel
>>>
>>>
>>> *From:* Luis Ibanez [mailto:luis.ibanez at kitware.com]
>>> *Sent:* 02 July 2009 23:56
>>> *To:* Ezequiel Geremia
>>> *Cc:* itk
>>> *Subject:* Re: [Insight-users] Convert NRRD into DICOM
>>>
>>>
>>>
>>> Hi Ezequiel,
>>>
>>> Thanks for posting the error message from the Exception.
>>>
>>> I just verified that a NRRD header file can be moved along
>>> with its associated .raw file to a different directory and still
>>> be read with the NRRD reader included into ITK.
>>>
>>> --
>>>
>>>
>>> Looking at the code...
>>>
>>>  ...(Ah!, the Unbeatable Glory of Open Source)...
>>>
>>> We find that the error message that you posted is being
>>> generated by line 161 of:
>>>
>>>            Insight/Utilities/NrrdIO/formatNRRD.c
>>>
>>> that curiously is part of (160-165):
>>>
>>>      if ((err = (char*)malloc(strlen(fname) + AIR_STRLEN_MED))) {
>>>        sprintf(err, "%s: couldn't open \"%s\" (data file %d of %d) for
>>> %s",
>>>                me, fname, nio->dataFNIndex+1, (int)_nrrdDataFNNumber(nio),
>>>                reading ? "reading" : "writing");
>>>        biffAdd(NRRD, err); free(err);
>>>      }
>>>
>>>
>>>
>>> Admittedly,
>>> the error message is quite misleading here...
>>>
>>> It is clear that what is happening in these lines above
>>> is that the code is failing to allocate enough memory
>>> for your image.
>>>
>>> So...
>>> please tell us:
>>>
>>>
>>>       A)  How big is the image ?
>>>
>>>       B)  How much RAM do you have ?
>>>
>>> and please run this code while you have open the
>>> TaskManager, and check on how much memory
>>> is available at the time the program post this message.
>>>
>>>
>>> If memory allocation turns out to be the real problem,
>>> please feel free to add a bug report suggesting
>>> that this error message be replaced with something
>>> that indicates that we are dealing with a Memory
>>> Allocation problem, as opposed to an I/O problem.
>>>
>>> You can report bugs at:
>>> http://public.kitware.com/Bug/my_view_page.php
>>>
>>>
>>>
>>>
>>>     Please let us know what you find,
>>>
>>>
>>>           Thanks
>>>
>>>
>>>                  Luis
>>>
>>>
>>>
>>> -----------------------------------------------------------------------------
>>>
>>> On Thu, Jul 2, 2009 at 1:31 PM, Ezequiel Geremia <t-egerem at microsoft.com
>>> <mailto:t-egerem at microsoft.com>> wrote:
>>>
>>> Hi Luis,
>>>
>>> The reader.Update() call is inside a try\catch block.
>>>
>>> Here is the exception which is caught:
>>>
>>> ExceptionObject caught !
>>>
>>> itk::ExceptionObject (00A0E9A8)
>>> Location: "void __thiscall itk::NrrdImageIO::ReadImageInformation(void)"
>>> File: ..\..\..\src\Code\IO\itkNrrdImageIO.cxx
>>> Line: 264
>>> Description: itk::ERROR: NrrdImageIO(025D1DC0): ReadImageInformation:
>>> Error read
>>> ing C:\Downloads\MS-Lesion-Segmentation-2008\Extracted-Files\Test
>>> ing-Data\CHB_test1_Part1\CHB_test1_Case01\CHB_test1_Case01_FLAIR.nhdr:
>>> [nrrd] nrrdLoad: trouble reading "C:\Downloads\MS-Lesion-Segmenta
>>>
>>> tion-2008\Extracted-Files\Testing-Data\CHB_test1_Part1\CHB_test1_Case01\CHB_test
>>> 1_Case01_FLAIR.nhdr"
>>> [nrrd] nrrdRead: trouble reading NRRD file
>>> [nrrd] _nrrdFormatNRRD_read: couldn't open the first datafile
>>> [nrrd] nrrdIoStateDataFileIterNext: couldn't open
>>> "./CHB_test1_Case01_FLAIR.raw"
>>>  (data file 1 of 1) for reading
>>>
>>> In this case, the reader does not seem to add the path of the header file
>>> (i.e.
>>> "C:\Downloads\MS-Lesion-Segmentation-2008\Extracted-Files\Testing-Data\CHB_test1_Part1\CHB_test1_Case01\")
>>> to the filename found in the header file and which is in the same directory
>>> (i.e. "./CHB_test1_Case01_FLAIR.raw").
>>>
>>> Many thanks,
>>>
>>>
>>> Ezequiel
>>>
>>> -----Original Message-----
>>> From: Luis Ibanez [mailto:luis.ibanez at kitware.com
>>> <mailto:luis.ibanez at kitware.com>]
>>>
>>> Sent: 02 July 2009 17:51
>>> To: Ezequiel Geremia; Insight Users
>>> Subject: Re: [Insight-users] Convert NRRD into DICOM
>>>
>>>
>>> Hi Ezequiel,
>>>
>>> Thanks for the update.
>>>
>>> I haven't seen this problem before.
>>>
>>> I would be very surprised if the reader relies on absolute
>>> paths, because that will mean that it is impossible to
>>> move NRRD files from one computer to another,... and even
>>> from one directory to another in the same machine.
>>>
>>>
>>>
>>> Did you got an error message ?
>>>
>>> If so,
>>> Could you please post it to the mailing list ?
>>>
>>> Are you placing the Update() call of the reader
>>> inside a try/catch block ?
>>>
>>>
>>>
>>>  Please let us konw
>>>
>>>
>>>     Thanks
>>>
>>>
>>>       Luis
>>>
>>>
>>> ------------------------
>>> Ezequiel Geremia wrote:
>>>  > Hi Luis,
>>>  >
>>>  > Thank you for answering my mail,
>>>  >
>>>  > I managed to read NRRD format by passing the header .nhdr or .mhd files
>>> and to convert them into DICOM series.
>>>  >
>>>  > The NRRD format I got form the MS Segmentation Challenge 2008 & Liver
>>> Tumor Segmentation Challenge 2008 websites seem to be specified as the union
>>> of a header and a RAW data file.
>>>  >
>>>  > However I experienced another issue concerning the reader. When I pass
>>> the header, which contains the relative filename of the .raw file to be
>>> converted, as an input, the reader is not able to find it (maybe because the
>>> reader relies on absolute filenames).
>>>  >
>>>  > Do you know a way out of this ?
>>>  >
>>>  > Regards,
>>>  >
>>>  > Ezequiel
>>>  >
>>>  >
>>>  >
>>>  > -----Original Message-----
>>>  > From: Luis Ibanez [mailto:luis.ibanez at kitware.com
>>> <mailto:luis.ibanez at kitware.com>]
>>>  > Sent: 30 June 2009 22:27
>>>  > To: Ezequiel Geremia
>>>  > Cc: insight-users at itk.org <mailto:insight-users at itk.org>
>>>  > Subject: Re: [Insight-users] Convert NRRD into DICOM
>>>  >
>>>  >
>>>  >
>>>  > Hi Ezequiel,
>>>  >
>>>  >
>>>  >      If your input file is in NRRD format,
>>>  >      why are you passing a RAW format as input ?
>>>  >
>>>  >
>>>  > ITK is expecting that a NRRD file will be called
>>>  >
>>>  >                LTS_IMG05.nrrd
>>>  >
>>>  > not to be called:
>>>  >
>>>  >                LTS_IMG05.raw
>>>  >
>>>  >
>>>  >
>>>  > Also, is this image 2D or 3D ?
>>>  >
>>>  >
>>>  > You may have to retouch the example code in order
>>>  > to manage 3D images.
>>>  >
>>>  >
>>>  >     Regards,
>>>  >
>>>  >
>>>  >         Luis
>>>  >
>>>  >
>>>  > --------------------------
>>>  > Ezequiel Geremia wrote:
>>>  >
>>>  >>Hi,
>>>  >>
>>>  >>
>>>  >>
>>>  >>I tried to convert NRRD, which is ITK supported format, data volumes
>>>  >>into DICOM volumes using the generic converter given in
>>>  >>/ImageReadWrite.exe/ with the following arguments
>>>  >>
>>>  >>-          Input file: LTS_IMG05.raw
>>>  >>
>>>  >>-          Output file: LTS_IM05.dcm (also tried .dic and .dicom file
>>>  >>extensions)
>>>  >>
>>>  >>-          Exception:
>>>  >>
>>>  >>itk::ImageFileReaderException (0146EEC0)
>>>  >>
>>>  >>Location: "void __thiscall itk::ImageFileReader<class
>>>  >>itk::Image<short,3>,class itk::DefaultConvertPixelTraits<short>
>>>  >> >::GenerateOutputInformation(void)"
>>>  >>
>>>  >>File:
>>>
>>>  >>c:\users\t-egerem\software\insighttoolkit-3.14.0\src\code\io\itkImageFileReader.txx
>>>  >>
>>>  >>Line: 144
>>>  >>
>>>  >>Description:  Could not create IO object for file
>>>
>>>  >>C:\Users\t-egerem\Downloads\3D-Liver-Tumor-Segmentation-Challenge-2008\Extracted-Files\Testing-Data\LTS_IMG05.raw
>>>  >>
>>>  >>  Tried to create one of the following:
>>>  >>
>>>  >>    GDCMImageIO
>>>  >>
>>>  >>    MetaImageIO
>>>  >>
>>>  >>    PNGImageIO
>>>  >>
>>>  >>    VTKImageIO
>>>  >>
>>>  >>    GiplImageIO
>>>  >>
>>>  >>    BioRadImageIO
>>>  >>
>>>  >>    LSMImageIO
>>>  >>
>>>  >>    AnalyzeImageIO
>>>  >>
>>>  >>    NiftiImageIO
>>>  >>
>>>  >>    StimulateImageIO
>>>  >>
>>>  >>    JPEGImageIO
>>>  >>
>>>  >>    TIFFImageIO
>>>  >>
>>>  >>    NrrdImageIO
>>>  >>
>>>  >>    BMPImageIO
>>>  >>
>>>  >>    DICOMImageIO2
>>>  >>
>>>  >>  You probably failed to set a file suffix or set the suffix to an
>>>  >>unsupported type.
>>>  >>
>>>  >>
>>>  >>
>>>  >>Then I tried to shortcut the pluggable factory mechanism and it does
>>> not
>>>  >>as well with the same data it throws the following error message
>>>  >>
>>>  >>                itk::ExceptionObject (0122F614)
>>>  >>
>>>  >>Location: "void __thiscall itk::ImageFileReader<class
>>>  >>itk::Image<short,3>,class itk::DefaultConvertPixelTraits<short>
>>>  >> >::EnlargeOutputRequestedRegion(class itk::DataObject *)"File:
>>>
>>>  >>c:\users\t-egerem\software\insighttoolkit-3.14.0\src\code\io\itkImageFileReader.txx
>>>  >>
>>>  >>Line: 342
>>>  >>
>>>  >>Description: itk::ERROR: ImageFileReader(0172F7C0): ImageIO returns IO
>>>  >>region that does not fully contain the requested regionRequested
>>> region:
>>>  >>ImageRegion (0122F8D8)
>>>  >>
>>>  >>  Dimension: 3
>>>  >>
>>>  >>  Index: [0, 0, 0]
>>>  >>
>>>  >>  Size: [0, 0, 0]
>>>  >>
>>>  >>StreamableRegion region: ImageRegion (0172F8A4)
>>>  >>
>>>  >>  Dimension: 3
>>>  >>
>>>  >>  Index: [0, 0, 0]
>>>  >>
>>>  >>  Size: [0, 0, 0]
>>>  >>
>>>  >>
>>>  >>
>>>  >>If you can think of a solution can you please point it out to me ?
>>>  >>
>>>  >>
>>>  >>
>>>  >>Regards,
>>>  >>
>>>  >>
>>>  >>
>>>  >>Ezequiel Geremia
>>>  >>
>>>  >>
>>>  >>
>>>  >>
>>>
>>>  >>------------------------------------------------------------------------
>>>  >>
>>>  >>_____________________________________
>>>  >>Powered by www.kitware.com <http://www.kitware.com>
>>>  >>
>>>  >>Visit other Kitware open-source projects at
>>>  >>http://www.kitware.com/opensource/opensource.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
>>>  >
>>>  >
>>>  >
>>>
>>>
>>
>> _____________________________________
>> Powered by www.kitware.com
>>
>> Visit other Kitware open-source projects at
>> http://www.kitware.com/opensource/opensource.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
>>
>


More information about the Insight-users mailing list