[Insight-users] Wrapping R with SimpleITK

Bradley Lowekamp blowekamp at mail.nih.gov
Wed Jan 4 10:41:31 EST 2012


On Jan 4, 2012, at 10:07 AM, Brandon Whitcher wrote:

> Wes, thanks for your input here.  That would be great.  Do your methods depend upon any ITK/SimpleITK routines?  I'm wondering if it would be better to keep SimpleITK (the R wrapper version) as a separate R package and then develop additional packages that add features, or just put everything in one package (hmm).  

For python we have added interface methods to numpy as part of the SimpleITK package. I would think that converting sitk::Images to R arrays would be a very common usage, so it sounds like it should be fairly tightly coupled with the SimpleITK package. Is the multi-dimensional array part of the standard R interface or a separate package.

The swig documentation for R is fairly poor:
http://www.swig.org/Doc2.0/SWIGDocumentation.html#R

Swig has to support more standard features then are listed there.

If you are wondering how we did the python numpy interface, you can begin by looking at the Wrapping/Python.i file:

http://itk.org/gitweb?p=SimpleITK.git;a=blob;f=Wrapping/Python.i;h=ca732fc3e219e3ec6f76974adc9e015282b52562;hb=HEAD

I that with this information and the way VTK interfaces with R can help get you started.

Brad

> 
> For me, I've developed (with others) a lot of mathematical modelling and statistical inference methods in R that operate on multidimensional arrays (usually coming from one of the medical imaging data formats); e.g., for functional MRI, DTI, HARDI or DCE-MRI.  What we lack is the so-called pre-processing techniques needed in medical image analysis: segmentation, filtering, registration, etc.  Hence, SimpleITK (the R wrapper version) would be a great way to access the techniques listed previously on data that have been read it via R, and stored as multidimensional arrays, then take the output back into R for further analysis and visualization.
> 
> I'm looking for the best way to incorporate the impressive variety of ITK routines into my R-based data analysis pipeline.
> cheers...
> 
> Brandon
> 
> On 3 January 2012 18:28, Wes Turner <wes.turner at kitware.com> wrote:
> 
> 
> On Tue, Jan 3, 2012 at 10:37 AM, Bradley Lowekamp <blowekamp at mail.nih.gov> wrote:
> Hello,
> 
> It is great to hear that you are approaching ITK for the first time with SimpleITK. Your feed back is very much appreciated so that we can improve the documentations and the compilation procedures for a easier experience.
> 
> 
> I have added the source of your Data problem to the FAQ here:
> 
> http://www.itk.org/Wiki/ITK/Release_4/SimpleITK/FAQ#Where_is_the_Input_Data.3F_or_Why_is_my_Testing.2FData_directory_empty.3F
> 
> The output you have attached looks great! I hope you have had success trying additional filters by now.
> 
> You said that you want to read Nifti and ANALYZE data with R. ITK  and SimpleITK also have good support for these image formats, so you may be able to read directly with SimpleITK's ReadImage method or the ImageFileReader object.
> 
> There is currently no optimized method for exporting a SimpleITK image into an R array. So you are likely must use the slow SetPixel and GetPixel methods. 
> 
> There are methods currently in VTK for conversion between VTK and R structures for some subset of formats.  I would be willing to provide some help and guidance.  It is only two classes and should be a short putt.
> 
> - Wes
> 
> 
> For visualization in SimpleITK we have a primitive sitk.Show method. This method currently just writes the image out to disk and then loads is up in ImageJ. To use the, you need a recent version of ImageJ. We hope to make this methods more configurable in the future, and take advantage built in language specific visualization tools. However, with SimpleITK supporting 2D, 3D image, along with all the vector pixel types, and complex pixel types etc... many existing tools don't have the needs support for all these possibilities.
> 
> Enjoy,
> 
> Brad
> 
> 
> ========================================================
> Bradley Lowekamp  
> Medical Science and Computing for
> Office of High Performance Computing and Communications
> National Library of Medicine 
> blowekamp at mail.nih.gov
> 
> On Jan 2, 2012, at 3:46 AM, Brandon Whitcher wrote:
> 
>> Following up on my previous message I found a copy of cthead1.png at 
>> 
>> http://itk.org/gitweb?p=SimpleITKData.git;a=commitdiff;h=f7d86582b91a35e5c8d30f1b58320bc47cc658fa
>> 
>> ...and downloaded it.  I have attached it and the "out.png" file from your example code.
>> 
>> > source("load.R")
>> 
>> Creating a generic function for ‘print’ from package ‘base’ in the global environment
>> > img <- ReadImage( "Input/cthead1.png" )
>> > (pid <- Image_GetPixelIDValue( img ))
>> [1] 1
>> 
>> > simg <- SmoothingRecursiveGaussian( img, 4 )
>> > cimg <- Cast( simg, pid )
>> > WriteImage( cimg, "out.png" )
>> 
>> Success!
>> 
>> Now I need to read up on ITK functions and how to take an array in R (containing ANALYZE or NIfTI data) and pass it into ITK, process it and bring it back in order to visualize/manipulate in R.  I have a package that performs basic I/O for ANALYZE and NIfTI using S4 objects in R (called oro.nifti) and it would be great to pass these arrays (along with the metadata) back-and-forth with SimpleITK.
>> 
>> cheers...
>> 
>> Brandon
>> 
>> 
>> 
>> On 2 January 2012 08:37, Brandon Whitcher <bwhitcher at gmail.com> wrote:
>> Brad, as you can tell I'm completely new to ITK... thank-you for your patience.  My SimpleITK (source) Testing/Data directory is empty from my "clone-ing" via Git (I am also a Git novice, sorry).  Looking at the version control tree at
>> 
>> http://itk.org/gitweb?p=SimpleITK.git;a=tree;f=Testing;h=eb50d756edee129fc26beb6d4c00f288ea49309a;hb=HEAD
>> 
>> ...I get...
>> 
>> m--------- - Data history
>> 
>> ...which doesn't look too promising from my knowledge of file permissions.  How can I overcome this?  May I ask for "cthead1.png" via email to try this example ASAP?
>> 
>> cheers...
>> 
>> Brandon
>> 
>> 
>> On 2 January 2012 04:21, Bradley Lowekamp <blowekamp at mail.nih.gov> wrote:
>> Hello Brandon,
>> 
>> As is frequently the case the first exception is the cause of the remainder. To understand the first error message some explanation of the how SimpleITK manages image types is needed.
>> 
>> There may be some relevant information in the SimpleITK presentation from MICCAI 2011:
>> https://github.com/SimpleITK/SimpleITK-MICCAI-2011-Tutorial/blob/master/Presentation/SimpleITK-MICCAI-2011.pdf?raw=true
>> 
>> 
>> The sitk::Image class is a typeless image class which wraps numerous ITK image types. Externally the sitk::Image class presents the same interface for all images, wether it is a scalar itk::Image, a multicomponent itk::VectorImage, or even a run-line compressed itk::LabelMap. And then each of these ITK image types are templated over the dimension and the pixel type. So SimpleITK presents dozens of itk images types through a single sitk::Image object. 
>> 
>> So SimpelITK is not strongly typed on these individual image types, but it is type aware.
>> 
>> ITK  filters are also templated on the input, and output image types. But SimpleITK again type not expose the details of all the templated types, and instead just exposes a generic interface to the image filter, and internally is instantiates the image filter with all the plausible input image types, and the sensible corresponding output image types. 
>> 
>> There are a few methods which can be used to interrogate the image after it's loaded:
>> 
>> First there is the ToString member function which just dumps out  bunch of information about the internal ITK object:
>> 
>> >cat( Image_ToString( myimage ) )
>> 
>> And more specific methods:
>> 
>> > Image_GetDimension( myimage )
>> > Image_GetPixelIDTypeAsString( myimage )
>> > Image_GetPixelIDValue( myimage )
>> 
>> So lets look at what happens with the image you have chosen to run this script with
>> 
>> On Jan 1, 2012, at 9:03 AM, Brandon Whitcher wrote:
>> 
>>> Brad,
>>> 
>>> I have attempted to run SimpleGaussian.R in an interactive R session by executing
>>> 
>>> 
>>> using the "spine1.png" image (attached, along with load.R).
>> 
>> The data used for the tests can be found in the {SIMPLEITK_SOURCE}/Testing/Data.
>> 
>>> 
>>> The code fails to produce a smoothed image, here is the output
>>> 
>>> > source("load.R") # library(SimpleITK)
>>> > 
>>> > args <- c("spine1.png", 5, "spine1_smooth.png") # commandArgs(TRUE)
>>> > 
>>> > myreader <- ImageFileReader()
>>> > myreader <- ImageFileReader_SetFileName(myreader, args[[1]])
>>> > myimage <- ImageFileReader_Execute(myreader)
>>> > 
>> 
>> if you run:
>> >cat( Image_ToString( myimage ) )
>> 
>> You should see the following line:
>> 
>> RTTI typeinfo:   itk::VectorImage< unsigned char, 2u>
>> 
>> Or if you run:
>> 
>> > Image_GetPixelIDTypeAsString( myimage )
>> [1] "vector of 8-bit unsigned integer"
>> 
>> So with either of these methods you see that this file is not a black and white image that it first appears, but actually a RGB image loaded into an Itk::VectorImage
>> 
>>> > pixeltype <- Image_GetPixelIDValue(myimage)
>>> > 
>>> > myfilter <- SmoothingRecursiveGaussianImageFilter()
>>> > myfilter <- SmoothingRecursiveGaussianImageFilter_SetSigma(myfilter, as.double(args[2]))
>>> > smoothedimage <- SmoothingRecursiveGaussianImageFilter_Execute(myfilter, myimage)
>>> Warning message:
>>> In f(...) :
>>>   Exception thrown in SimpleITK SmoothingRecursiveGaussianImageFilter_Execute: /srv/SimpleITK/Code/Common/include/sitkMemberFunctionFactory.txx:173:
>>> sitk::ERROR: Pixel type: vector of 8-bit unsigned integer is not supported in 2D byN3itk6simple37SmoothingRecursiveGaussianImageFilterE
>> 
>> While this error message could use improvement  ( and will be improved ). It basically says that this filter doesn't work with this particular image type  ( it should also list the types of images it does work with ). This particular filter currently only works with scalar image type. So this image with sitkVectorUInt8 pixels is not going to work. 
>> 
>> 
>> 
>>> > 
>>> > mycaster <- CastImageFilter()
>>> > mycaster <- CastImageFilter_SetOutputPixelType(mycaster, pixeltype)
>>> > castedimage <- CastImageFilter_Execute(mycaster, soothedimage)
>>> Error in CastImageFilter_Execute(mycaster, soothedimage) : 
>>>   object 'soothedimage' not found
>> 
>> There appears to be a typeo "soothedimage" should be "smoothedimage". However, I think the same error message should be generated because the smoothedimage was not assigned due to the previous exception.
>> 
>>> > 
>>> > mywriter <- ImageFileWriter()
>>> > mywriter <- ImageFileWriter_SetFileName(mywriter, args[[3]])
>>> > mywriter <- ImageFileWriter_Execute(mywriter, castedimage)
>>> Error in ImageFileWriter_Execute(mywriter, castedimage) : 
>>>   object 'castedimage' not found
>>> 
>>> I am not sure what to make of the warnings or errors (sorry).  Any advice or modifications would be helpful.  I am using spine1.png since I cannot locate STAPLE1.png in either the ITK or SimpleITK directories.
>>> 
>> 
>> Using the functional interface the following may be simpler:
>> 
>> img <- ReadImage( "/src/SimpleITK/Testing/Data/Input/cthead1.png" )
>> pid <- Image_GetPixelIDValue( img )
>> simg <- SmoothingRecursiveGaussian( img, 4 )
>> cimg <- Cast( simg, pid )
>> WriteImage( cimg, "out.png" )
>> 
>> Good luck,
>> Brad
>> 
>>> thanks,
>>> 
>>> Brandon
>>> 
>>> 
>>> On 31 December 2011 18:34, Bradley Lowekamp <blowekamp at mail.nih.gov> wrote:
>>> Hello again,
>>> 
>>> I was not able to get the R packaging to work as described in the link provided. I did find a manual way to load the SimpleITK R library.
>>> 
>>> Copy the SimpleITK.R file and the libSimpleITK.so ( renamed to SimpleITK.so ) into your current path, such as with the following commands:
>>> 
>>> cp SimpleITK/SimpleITK-build/Wrapping/SimpleITK.R
>>> cp SimpleITK/SimpleITK-build/Wrapping/SimpleITK.R ./
>>> 
>>> 
>>> The fire up R and type:
>>> 
>>> $ R
>>> 
>>> R version 2.14.0 (2011-10-31)
>>> ...
>>> 
>>> > dyn.load( paste("SimpleITK", .Platform$dynlib.ext, sep="" ))
>>> > source ( "SimpleITK.R" )
>>> Creating a generic function for ‘print’ from package ‘base’ in the global environment
>>> > cacheMetaData( 1 )
>>> 
>>> Here is an example that was working at one point:
>>> 
>>> http://www.itk.org/SimpleITKDoxygen/html/SimpleGaussian_8R-example.html
>>> 
>>> However the "library( SimpleITK )" call is used for when SimpleITK is installed as a package not the adhoc approach used above.
>>> 
>>> Good Luck,
>>> Brad
>>> 
>>> On Dec 31, 2011, at 1:11 PM, Lowekamp, Bradley (NIH/NLM/LHC) [C] wrote:
>>> 
>>>> Hello Brandon,
>>>> 
>>>> The particular files you looking for are in the SimpleITK source directory not the build. You will need both the DESCRIPTION and the zzz.R files from the {SIMPLEITK_SOURCE}/Wrapping/R_Package directory.
>>>> 
>>>> We have been calling R a Tier 2 or Tier 3 language in SimpleITK because is not as well supported as the other wrapped languages such as Python, Java, CSharp or even Ruby, or TCL. The primary reason for this is that we have not gotten the automatic testing working for R, so that it will show up on the nightly dashboard. Additionally, we also are hoping for contribution from the community to get the R language specific features polished and up to the expected R standard conventions.
>>>> 
>>>> I hope this helps you with getting SimpleITK working R,
>>>> 
>>>> Brad
>>>> 
>>>> ========================================================
>>>> Bradley Lowekamp  
>>>> Medical Science and Computing for
>>>> Office of High Performance Computing and Communications
>>>> National Library of Medicine 
>>>> blowekamp at mail.nih.gov
>>>> 
>>>> On Dec 31, 2011, at 9:28 AM, Brandon Whitcher wrote:
>>>> 
>>>>> Dear ITK/SimpleITK experts,
>>>>> 
>>>>> I have installed SimpleITK by turning off all wrapping facilities except WRAP_R.  I am now following the instructions in
>>>>> 
>>>>> http://www.itk.org/SimpleITKDoxygen/html/Wrapping.html
>>>>> 
>>>>> Specifically, 
>>>>> 
>>>>> 6) Copy the file
>>>>>        SimpleITK/Wrapping/R_Package/DESCRIPTION
>>>>> into the current
>>>>> 
>>>>>        SimpleITK/DESCRIPTION
>>>>> ...but I cannot find the file Wrapping/R_package/DESCRIPTION in my SimpleITK-binary installation.  Where is this file?
>>>>> 
>>>>> thank-you,
>>>>> 
>>>>> Brandon
>> 
> 
> 
> 
> 
> 
> 
> _____________________________________
> 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
> 
> 
> 
> 
> -- 
> Wesley D. Turner, Ph.D.
> Kitware, Inc.
> Technical Leader
> 28 Corporate Drive
> Clifton Park, NY 12065-8662
> Phone: 518-881-4920
> 

========================================================
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/20120104/62e360c9/attachment.htm>


More information about the Insight-users mailing list