
The versions of the book and examples below are as of December 12th, 2006. These will be updated periodically.
- The book in the original .pdf format (5.4MB)
- The book in a compressed .pdf format (1.9MB) -- the figure quality is lower.
- The complete set of examples (2.5 MB) from the book. This includes sample medical images.
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.
xenophon.papademetris@yale (DOT) edu
