[ITK-users] SimpleITK | read a 3D image from a non DICOM file and write it as a series of DICOM slices
Bradley Lowekamp
blowekamp at mail.nih.gov
Wed Dec 31 10:46:45 EST 2014
Hello,
Sorry for the slow reply. Earlier you linked to this nice example for reference:
http://www.itk.org/Doxygen/html/Examples_2IO_2ImageReadDicomSeriesWrite_8cxx-example.html
With SimpleITK I have done the following when I needed to write a series in Python:
for i in range(img.GetSize()[2]):
sitk.WriteImage(img[:,:,i],"test_{0:04}.tif".format(i))
However it is not quite this simple for a DICOM series. The metadata tags need to be correct too. SimpleITK is not designed to be a full fledge interface to DICOM files. Other tools may be better for that. But this seems like a reasonable thing to do but it's not currently readily available in the SimpleITK interface. Perhaps after some discussion on the best way to do it it and be added.
There are 3 main components to this example:
1) MetaDataDictionary
In SimpleITK the MetaDataDictionary interface is only part of the Image class. Currently it provides a read only interface, with the GetMetaDataKeys(), and GetMetaData(key) methods[1]. This get method only returns the type of data in the dictionary converted to a string.
The required method would be Image::SetMetaData(key,value). The issue would be what types of value need to be supported. For this example only std::string is needed, perhaps others should be overloaded?
2) NumericSeriesFileNameGenerator
This class only produces a "list" of file names. I think that many of the languages may have a more convenient way to do this. For example in Python:
[ "test_{0:04}.png".format(i) for i in range(img.GetSize()[2]) ]
So I don't think this is so important.
3) SeriesWriter
What we just used above is different then the SeriesWriter, as special metadata is passed from the ImageSeriesWriter to the ImageIO [2]. Here is the JIRA issue for this task [3].
So after these get done something like the following would do what you ask:
import SimpleITK as sitk
img = stik.ReadImage(argv[1])
img.SetMetaData("008|0060", "MR") // Modality
img.SetMetaData("008|0008", "DERIVED\\SECONDARY") // Image Type
img.SetMetaData("008|0064", "DV") // Conversion Type
sitk.WriteImage(img, [ "test_{0:04}.dcm".format(i) for i in range(img.GetSize()[2]) ])
Does that look like what you are looking for?
Brad
[1] http://www.itk.org/SimpleITKDoxygen/html/classitk_1_1simple_1_1Image.html#a3d6cb12a211352ee38da5405b9c75928
[2] https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/IO/ImageBase/include/itkImageSeriesWriter.hxx#L327-L368
[3] https://issues.itk.org/jira/browse/SIMPLEITK-122
On Dec 29, 2014, at 2:48 PM, Matias Montroull <matimontg at gmail.com> wrote:
> Hi,
>
> Is there an example for SimpleITK to read a 3D image from a non Dicom file such as mhd and then write it as a series of DICOM Slices?
>
> I can do this with C++ but I haven't been able to figure out how to do it using simpleITK.
>
> Thanks,
>
> Matias.
> _____________________________________
> 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://public.kitware.com/mailman/listinfo/insight-users
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/insight-users/attachments/20141231/fb677969/attachment.html>
More information about the Insight-users
mailing list