[Insight-users] Wrapping R with SimpleITK

Wes Turner wes.turner at kitware.com
Tue Jan 3 13:28:32 EST 2012


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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20120103/e334bd57/attachment.htm>


More information about the Insight-users mailing list