This is a series of articles on the topic of DICOM that I have been working on slowly. DICOM is vast and complex because it deals with several areas of the information technology that enables diagnostic medicine such as imaging, image transfer, image storage, procedures, printing, and interpretation. The more I read and understand the history and evolution of this standard, I am blown away by wisdom and the foresight of the committee that designed the original standard and continues to improve it to this day. The standard provides a specification to enable information connectivity among a variety of vendors' products from the past, present and the future.
“Whatever you do will be insignificant, but it is very important that you do it.” ~ Mahatma Gandhi
I am writing this series primarily for two reasons. The first reason is that I wanted to give back some of the learning that I have gained through the years from other people (mostly through the Internet). Finding information regarding this standard from a software programmer perspective always was hard and still continues to be that way. Keeping this in mind, I have attempted to write this series with as many code examples as I could tying the theory to the implementation where I can. The second reason I am writing this series is that it provides me with an opportunity to brush up on my own knowledge of DICOM (especially on some topics which I have had only minimal exposure to; WADO is one example). Very rarely do DICOM application developers work on all aspects of this standard. For instance, someone who works on implementing a DICOM viewer or deals with image manipulation rarely ever works on the communications/networking side of the standard as well, or vice versa. So, I really feel that I have benefited from writing these articles by exploring nearly all areas of the standard.
Here are the articles in this series:
★ DICOM Basics - Query and Retrieve Operations - Part 2 of 2
★ DICOM Basics - Storage Commitment Service
★ DICOM Basics - Understanding Worklists and MPPS
★ DICOM Basics - Understanding DICOM Structured Reports
★ DICOM Basics - Understanding Print Operations
★ DICOM Basics - Understanding WADO
★ DICOM Basics - FHIR and DICOM
★ DICOM Basics - Troubleshooting
★ DICOM Basics - Conformance Testing
★ DICOM Basics - How do HL7, DICOM and IHE come together
★ DICOM Basics - Doing DICOM on other languages/platforms
★ DICOM Basics - Machine Learning and Imaging
I hope this series of articles is useful to programmers and other information technology personnel who are new to this field by providing a quick and yet broad understanding necessary of the fundamentals before they attempt to build DICOM applications or participate in any DICOM-related initiatives. I have taken some liberties at simplifying some technical details for the newcomer. This is especially the case when I explain DICOM encoding as this is a difficult area to explain. Several a DICOM files that I use throughout my examples may be more than eight characters long. The standard stipulates the file identifiers (names) to be at most 8 characters long (either uppercase alphabetic characters and numbers only) However, I deviate from this at the beginning of my tutorials intentionally to keep these details from distracting the learner. I hope you will forgive me for these small liberties in light of my main intention here which is to explain details regarding the standard by relating it to things that the readers are already comfortable with. Also, a quick disclaimer that I do not serve on the DICOM standards committee. So, you should to refer to the standard itself and its latest recommendations before starting any project involving this standard.
I will use Java language-based examples through this entire tutorial series as the language is easy to read for programmers coming from a variety of backgrounds including C, C#, Python,etc. I use a freely available and powerful DICOM toolkit called PixelMed Java DICOM Library. Although I like this implementation as it is easy to get started, you should be aware that there are a number of other toolkits (such as dcm4che, DicomObjects and DCMTK which are as good if not better in some respects) in the market. You should be able to follow along easily with any other toolkit (open source or otherwise) if you wish to do so as many of the DICOM-related concepts I explain in my tutorials are implemented by these toolkits in some form or the other. I chose this toolkit because it is more or less standalone and is therefore easy to install and illustrate many concepts through succinct code examples. Looking at the source code of this toolkit, one does notice it is a bit dated in terms of programming practices and object-orientation and reflects the time at which this was written. But the author(s) have done a tremendous job in providing the breadth of DICOM-related features within it. Please also note that the use of the PixelMed DICOM toolkit in this tutorial series does not in anyway imply my official endorsement of it for implementing DICOM-related functionality in your production application. Every situation is unique, and only you are in the best position to decide what is best for you and your end users.
This series is also not meant to be a tutorial on the PixelMed toolkit as my focus is simply to tie DICOM concepts to things any programmer should be able to relate to. So, if your goal is to learn how to use this toolkit and the vast number of classes, interfaces and utility functions it offers, then I would recommend that you contact the author or any online help page of this toolkit for assistance. I get many questions from people on how to use PixelMed to do something on their DICOM project, and my answer to them is that you should be using the discussion forum page for your questions. I would also encourage you to visit the PixelMed website and the online documentation of the toolkit for additional information.
If you have any questions or comments regarding these articles/tutorials, please feel free to send me an email. Please note that I may not get back to you right away due to work and other commitments.