Introduction to Programming for Image Analysis with VTK


This page contains information about the book An introduction to Programming for Medical Image Analysis With the Visualization Toolkit (238 pages).  This book is an edited and expanded collection of class notes that I wrote for the graduate seminar ``Programming for Medical Image Analysis'' (ENAS 920a) that was taught at Yale University, Department of Biomedical Engineering, in the Fall of 2006. It is currently in draft version but it is made available in the hope that it will be useful as a (self-)teaching tool for researchers in this area. Please be warned that the book is still in preparation -- in particular the references section is still incomplete.

The versions of the book and examples below are as of December 12th, 2006. These will be updated periodically.

The table of contents and the preface of the book are given below. This book replaces a somewhat dated set of notes that were posted about 4 years ago.


Table Of Contents

Preface ............................................5

Part I: Introduction

1. Introduction ....................................8

2. Revision Control With Subversion ...............13

Part II: Programming with Tcl/Tk

3. Introduction to Tcl ............................19

4. Advanced Topics in Tcl .........................27

5. An Introduction To Tk ..........................35

6. Tk Part II .....................................43

7. Object Oriented Programming with [ Incr ] Tcl ..53

8. Iwidgets: Object Oriented GUIs .................63

Part III: The Visualization Toolkit I -- Using Tcl

9. An Introduction to the Visualization Toolkit ...71

10.Curves and Surfaces in VTK .....................76

11.Images in VTK ..................................86

12.Displaying Images in VTK .......................93

13.Transformations ...............................105

14.Some Additional VTK Classes ...................114

Part IV: Interfacing To BioImage Suite using Tcl

15.Leveraging BioImage Suite Components ..........122

16.Writing your own BioImage Suite Application ...132

Part V: C++ Techniques

17.Cross-Platform Compiling with CMAKE ...........147

18.C++ Techniques and VTK ........................154

Part VI: VTK Programming with C++ and Tcl

19.Extending VTK using C++ .......................167

20.Point-based Registration with ICP .............179

21.Intensity Based Segmentation ..................197

22.A Templated Image to Image Filter .............215

23.Copying Data Objects ..........................222

24.The Insight Toolkit ...........................226

Appendices

A. Final Exam ....................................235

B. Code License ..................................236

References .......................................237

From the Preface

This book is an edited and expanded collection of class notes that I wrote for the graduate seminar ``Programming for Medical Image Analysis'' (ENAS 920a) that was taught at Yale University, Department of Biomedical Engineering, in the Fall of 2006. My goal for the class was to provide sufficient introductory material for a typical 1st year engineering graduate student with some background in programming in C and C++ to acquire the skills to leverage modern open source toolkits in medical image analysis and visualization such as the Visualization Toolkit (VTK) and, to a lesser extent, the Insight Toolkit (ITK).

One obviously has to acknowledge that there are many programming books out there that cover the material discussed in this book in more depth (and more correctly perhaps); I list many of my sources in Chapter 1. However, placed one on top of the other, these books form a pile about 1-2 feet high, which can be discouraging to a beginner. This book is meant to be an introductory guide. Many of the definitions are informal, much like one teaches math at 1st grade. As the student progresses and begins to understand the introductory material, then he/she should look at more specialized books which offer a deeper insight into what is going on. The manual pages for many of these toolkits also become useful at this point.

Most of our graduate students -- the intended audience for this book and class -- while having a strong applied mathematics/signal processing background, are not expert programmers. For the most part, they would have had some programming classes at the undergraduate level and would have been, most likely, exposed to C/C++ at some point. However, with rare exceptions, a dive into the combination of object-oriented and generic programming model used in ITK, for instance, would leave them befuddled.

Such students begin their graduate research in semester long projects called ``special investigations''. This is part of the process of identifying a topic for their research as well as a lab in which they will pursue their dissertation work. In our own research, in medical image analysis, the typical product of a doctoral dissertation is a mathematical framework for attacking an image analysis problem which has to be translated into computer code for testing and validation.

Most of the students, in these special investigations, prototype ideas in MATLAB. While MATLAB is a wonderful prototyping tool, it leaves much to be desired in terms of the development of the programming habits needed to write a large, sustainable, and reusable body of code. Unfortunately, many students ending up in the trap of developing the best algorithms that can be implemented in MATLAB as opposed to focusing on what on optimal algorithmic strategy would be. This is especially apparent once large 3D and 4D datasets enter into the picture, and their algorithms end up taking hours and days to run.

At this point in the game, a helpful professor suggests that they should probably look to move to a more efficient language such as C++. However, one look at straight C++ without any of the additional toolkits, makes them realize that switching to C++ is easier said than done. There are very few default operations for things like linear algebra, image processing, image display etc. Then, perhaps, another helpful person suggests that they take a look at VTK and/or ITK. While now, they can see that there is a ton of functionality out there, they are often lost as to where to begin. VTK and ITK are natural tools once one is used to them but they can be imposing and ``scary'' to the beginner. While there are some books out there (especially the VTK User's Guide) which are very helpful, they are often only obliquely related to what they really need to learn how to do: implement image analysis methods, learn how to (properly) display their results, and learn how to put a graphical user interface to enable them and their potential users to interact with the methods. The goal of the course, and this book, is to precisely provide the necessary guidance for a new graduate student in order to achieve these goals.

The selection of the material, as well as its presentation, is naturally colored by the author's own experience. I coordinate the BioImage Suite project, which is a large medical image analysis utility developed in a mixture of C++ and [ Incr] Tcl. (Interfacing with BioImage Suite is discussed in Chapters 15 and 16.) In part, the motivation for teaching this class and writing this book, is directly derived from the needs of the BioImage Suite project. In particular, the driving question was, how does one get a new programmer up to speed with the skills he/she will need in order to contribute? Perhaps somebody else teaching this class would have used Python instead of Tcl as the scripting language; this is as much a matter of taste (and endless discussions and sadly flame wars in this internet era) and experience with the particular language as anything else. Also, while I mention ITK towards the end -- see Chapter 24, the primary toolkit used here is VTK. The template-free interface of VTK makes it easier for beginners, and I find that ITK can be downright user-hostile to the less experienced programmer.

One of my complaints with many introductory texts is that they never attempt to teach how one goes about learning how to put together decent sized applications. They focus too much on ``grammar'' and too little on ``writing stories''. However, graduate students need to write ``stories'' -- useful ease-to-use tools that both they and clinical and/or basic science collaborators can use and maintain. Hence, as part of the class, I have also made an attempt to introduce some software engineering tools such as Subversion and CMAKE. As any experienced developer often learns the hard way, these tools can be just as critical as the choice of programming language or toolkit.

A disclaimer: While VTK is now at version 5.0 we still focus on VTK 4.4 -- this is the version in use in BioImage Suite at this point. As we migrate the software to VTK 5.x this book will be updated to reflect this.



Page design by Marcello DiStasio. Content by Xenios Papademetris.
xenophon.papademetris@yale (DOT) edu