[Insight-users] Wrapping R with SimpleITK
Wes Turner
wes.turner at kitware.com
Tue Jan 24 09:53:15 EST 2012
I think this would be a great idea. In fact I brought it up at a planning
session here at Kitware. The problem is finding the time to do something
substantial enough to generate an abstract. If you would like to get
together for a discussion, I would be happy to join you.
- Wes
On Tue, Jan 24, 2012 at 9:48 AM, Brandon Whitcher <bwhitcher at gmail.com>wrote:
> Wes and Bradley,
>
> I know we've gone silent on the R <-> ITK front, I'm still trying to find
> someone who will do the heavy lifting.
>
> Just to let you (and the other ITK list users) that the annual R users
> meeting will be at Vanderbilt University, Nashville, from 12-15 June.
>
> http://biostat.mc.vanderbilt.edu/wiki/Main/UseR-2012
>
> Abstracts are being accepted until 12 March. It would be a great way of
> promoting ITK to the R community!
>
> What are your thoughts?
>
> cheers...
>
> Brandon
>
>
> On 4 January 2012 17:42, Wes Turner <wes.turner at kitware.com> wrote:
>
>> I agree with Bradley that it should be part of the SimpleITK Package.
>> IMHO, it is too integral to the full functioning of the ITK to R interface
>> to keep separate.
>>
>> Here are the pointers to the VTK versions of the routines. We will need
>> to change it to use ITK arrays instead, but that should not be too
>> difficult. I am not sure how optimized these are, but once we get the
>> functionality encapsulated and into SimpleITK, we can work on optimization.
>>
>> Basic data conversion:
>>
>> http://vtk.org/gitweb?p=VTK.git;a=blob;f=Graphics/vtkRAdapter.cxx;h=d6049a5eb748f878df56d40b4c82aeec7fc51471;hb=HEAD
>>
>> http://vtk.org/gitweb?p=VTK.git;a=blob;f=Graphics/vtkRAdapter.h;h=83a2a833c18d8d8ce36d1f4e77e5cf12b5d2c217;hb=HEAD
>>
>> Interface to the R Interpreter (probably not needed)
>>
>> http://vtk.org/gitweb?p=VTK.git;a=blob;f=Graphics/vtkRAdapter.h;h=83a2a833c18d8d8ce36d1f4e77e5cf12b5d2c217;hb=HEAD
>>
>> http://vtk.org/gitweb?p=VTK.git;a=blob;f=Graphics/vtkRInterface.h;h=e98ce921b5a16c5299fdb8cccbb29793fcd8989b;hb=HEAD
>>
>> Pipeline encapsulation (probably not needed)
>>
>> http://vtk.org/gitweb?p=VTK.git;a=blob;f=Graphics/vtkRCalculatorFilter.cxx;h=bdc99183fb2a6b949228fcadbed63e4a9f0e9d9a;hb=HEAD
>>
>> http://vtk.org/gitweb?p=VTK.git;a=blob;f=Graphics/vtkRCalculatorFilter.h;h=08f43d42b724a608cc37fdba1268875dab7ceba8;hb=HEAD
>>
>> - Wes
>>
>>
>> On Wed, Jan 4, 2012 at 10:41 AM, Bradley Lowekamp <blowekamp at mail.nih.gov
>> > wrote:
>>
>>>
>>> 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
>>>
>>>
>>>
>>>
>>
>>
>> --
>> Wesley D. Turner, Ph.D.
>> Kitware, Inc.
>> Technical Leader
>> 28 Corporate Drive
>> Clifton Park, NY 12065-8662
>> Phone: 518-881-4920
>>
>
>
--
Wesley D. Turner, Ph.D.
Kitware, Inc.
Technical Leader
28 Corporate Drive
Clifton Park, NY 12065-8662
Phone: 518-881-4920
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20120124/a67ebfd7/attachment-0001.htm>
More information about the Insight-users
mailing list