Project 3: Isosurfaces

Ryan Miller - millerrv@purdue.edu

Task 1 (Task1.py)

I first read in the raw data (StructuredPoints) and pass the output to the described vtkContourFilter. I have the Python program automatically switch the isovalue range based on filename of the input data (i.e., head vs. feet).



Task 2 (Task2.py)

These images show isosurfaces for the feet and head CT scans colored with a discrete color map. By adjusting the isovalue slider, different surfaces reveal themselves in the visualization, specifically skin, bones, and muscle.

Which isosurfaces look the most interesting? The skin, of course, looks most life-like because it is a surface we are familiar with in everyday life. The bones of each CT scan (skull and bones of the feet) also turned out very realistic and resemble a 3-dimensional X-Ray. The muscles (in red) were hardest to visualize with the CT scan data. I am not sure that the CT scans could pick up the muscle fiber as well as the dense bone, so the muscles appear more "flaky" and discontinuous. However, there is some true muscle tissue present, for instance, ligaments extending to the toes in the feet CT scan.



Task 3 (Task3.py)

Much like the previous task, I used a discrete color map to give some separation the surfaces present at different isovalues -- skin, bones, and muscle. This visualization uses data derived from the magnitude of the surface gradient from the original data set, and therefore reflects different characteristics.

What isosurfaces did you find interesting and why? The skin surfaces visualized from the gradient magnitude data appear much like those in Task 2, so perhaps are least interesting in this case. The muscle and bone surfaces, however, have very different characteristics (discussed in the next question) and of more interest in this visualization.

How do these surfaces compare to the ones you obtained in Task 2? The magnitude of the gradient leads to a very different interpretation of the data. In this case, large gradient magnitude values appear more solid and free-flowing, while the smaller gradient magnitudes are discontinuous and rigid. Sections of skin that are stretched taut, the front of the foot, for instance, appear smooth and solid, while the "scrunched" skin of the toes and ankle show striations in the tissue. Similarly, the bone either appears smooth and solid, or rigid and striated for rapid curves and ripples in the bone. The gradient magnitude data makes it easier to identify larger bones because they tend to appear smoother and more solid.



Task 4 (Task4.py)

These images are the result of a vtkProbeFilter with the geometry set as input connection and the gradient magnitude set as source. Re-using the color map from Task 3 produced somewhat strange results -- areas of muscle and skin were mapped over bone.

How does each of these surfaces behave in this case? Each surface (skin, muscles, bones) seems to contain color map information from the surfaces above it. For instance, when looking at the muscles of the foot, the skin color is present over many of the joints of the bones. The bone surface appears to work normally, but interior surfaces (between teeth in the skull, in the eye sockets) seem to be colored with muscle tissue (in red). I am not sure why the skin surface, colored in beige in previous examples, now appears white like bone.

What relationship can you identify between this behavior and the associated gradient magnitude? The gradient magnitude source in the vtkProbeFilter seems to be affecting the color mapping quite a bit. Areas that appeared discontinuous and striated in Task 3 now inherit the color mapping of surfaces above them.

What does that tell you about the value of the resulting visualization? The color mapping seems to imply that certain areas contain a higher density of the surfaces above them, for instance areas of muscle connected to the skull. Therefore this visualization presents different information from the previous examples -- in this case, multiple colors from the color map combine at a certain isovalue to visualize the density of materials (defined by the gradient magnitude).



Task 5 (Task5.py)

This visualization task asked us to adjust another parameter important in any visualization -- the opacity. By setting lower values of opacity, we can prevent occlusion and allow the user to see multiple surface at once, something not possible in the previous examples. I modified my strategy slightly for this task by assigning each range of isovalue (essentially a "surface) to a separate vtkActor. It is then simple to set the opacity of the individual actors before they are rendered.

Comment on your selection of the transparency for each isosurface. I determined the best-looking opacity values mostly by trial and error. I settled on an opacity = 0.6 for the skin, and 0.4 for the muscles. Lower skin opacity values made it difficult to see the surface at all, and higher muscle opacities occluded the underlying bones. I left the bones at full opacity (1.0) because the data did not contain any interesting structures underneath this surface. This ensures the bones are as visible as possible behind the semi-transparent upper layers.

How does transparency benefit your visualization? Transparency in medical examples, such as the feet and head CT scans, allow the user to view anatomical structures in relation to one another. For example, the bones of the foot can now clearly be placed in relation to the entire foot, along with the muscle and fat surrounding them. Although transparency will lead to some occlusion (subtle indents in the bone are no longer as visible), for an overall view, transparency creates a very useful visualization that offers more information than the separated surfaces alone.



Task 6 (Task6.py)

This task was probably the most fun to work on in the project because it allowed the largest creativity. I use a vtkPlane as the clipFunction for the vtkClipPolyData to work. This plane exists near the center of the visualization, and I use a combination of two sliders -- left/right adjustment and angle adjustment to cut away different slices of the models. In a true medical application, more degrees of freedom would probably be beneficial, but this approach certain demonstrates the concept. As one additional point of interest, I left the un-clipped section of bone (essentially the bone sticking out from the cut-away) as mostly transparent (opacity = 0.2). I find this adds information to the visualization by allowing the user to see the amount of the surface that has been clipped away.

Comment on the choice of clipping plane position and orientation that you will be using for your images. I start with a simple up-down clipping plane that directly cuts the model in half. By rotating the camera, this view allows a complete visualization of the inside of the foot or head. One slider controls the left or right position of this vertical slice, allowing the user to dissect certain areas, while the angle slider (initially at 90 degrees), can be used to adjust the angle of the slice.

How was the setting selected? I chose the clipping plane mostly by trial-and-error, first determining the position of the plane in relation to the model, and then finding adjustment values that moved the plane (clipped the data) in ways that were most visually-interesting. I've seen head/foot CT scans before that appear as a slice from the side, so I figured this would be most medically-relevant as well.



Summary Analysis

Why might isosurfaces be widely used in medical applications? The isosurfaces generated in this project allow the user to visualize more information than the 2-dimensional CT slices alone. Isosurfaces also appear very sharp and can highlight small variations in surface, such as indents in bone. From a medical perspective, this ability to collectively see all variations in a surface would be of great importance to doctors looking to diagnose any problems. Hairline cracks that may span several CT scan slices are now visualized together, allowing the user to very easily see the severity of the problem.

Isosurfaces can also be implemented efficiently, allowing the user to interactively rotate and adjust parameters of the image (much like the tasks above asked us to do). Through interacting with the visualization, a doctor can gain new insight into how the data combines to form a complete image. By looking at different analyses, such as the gradient magnitude of the data, a doctor can also view information that is not readily visible in the original data.

Comment on the quality of the images you were able to obtain in each case. Although I am not too familiar with the field of medical imaging, the visualizations generated in this project look quite good. The bone surface, especially, seems to highlight small details that a simple X-Ray does not normally provide. Having the ability to zoom and rotate the image, of course, makes the visualization all the more useful and demonstrates the quality of the original data.

Discuss any shortcomings of the isosurfacing technique you may have come across in this assignment. The isosurface technique used in this project may not effectively communicate imprecision of the original data. The surfaces appear very sharp, which may lead the user into thinking that the original scans were equally as sharp, while in reality, some estimation and generality was introduced in order to create the visualization.

Another potential shortcoming of isosurfacing is the difficulty in separating surfaces and designing transfer functions. In the tasks above, the surfaces declared as "skin," "bones," and "muscle" were actually just best-guess approximations of where those surfaces exist. Without field knowledge, claiming that one surface defined by an isovalue represents what you'd like it to is very difficult.

Comment on the benefits and limitations of transparency and clipping planes to enhance the visualization. Transparency and clipping planes both allowed the user to see more data (additional surfaces) concurrently than the surfaces visualized alone. For this reason, a major benefit to employing transparency or clipping planes is the ability to see how multiple surfaces interact, for instance, how skin covers muscles attached to bone. An adjustable clipping plane, as Task 6 demonstrated, provides an excellent opportunity for the user to interact with the visualization and recognize more information than a static image alone.

A potential downside to transparency and clipping planes is that deciding the boundaries (opacity values for transparency, or the clipping plane position) can be quite difficult. Transparency can both add information (as described above), or hide information if it is not used correctly. For the clearest, most unobstructed view of a surface, visualizing each surface separately (perhaps through varying the isovalue) still offers the most information. But for an overall, "general picture" of the collection of data you have available, transparency and clipping planes both allow you to see more information at once.