In order to develop a method for opacity function generation that uses our boundary model and the information stored in the histogram volume, it is helpful to look at the equation we have used to describe the ideal boundary data value as a function of position:
Just as we have taken ``position'' to always be along an axis pointing
in the gradient direction, we define zero to always be the position of
the inflection point in the boundary.
and
are the
data values of the materials on either side of the boundary. As
ranges from
to
,
ranges from
to
.
The parameter controlling the amount of boundary blurring is
.
The first and second derivatives of
are as follows:
Our choice of boundary parameterization means that
is a
Gaussian, with
being the usual standard deviation. Since the
Gaussian has inflection points at
, this is where
attains its extrema. The same positions can serve as artificial
delimiters for the extent of the boundary -- we define the
``thickness'' of the boundary to be
. Note that the
thickness of a boundary can be recovered if the maximum values of
and
are known:
More importantly, once
is known, we can recover the position
knowing only the values of
and
:
Before using Eqn. 10 as the basis for opacity function
generation, we define some important functions of data value:
is the average first directional derivative of
over all the
positions
at which
, and
is likewise the average second directional derivative at value
.
These two functions can be obtained from the histogram volume by
slicing it at data value
, and finding the centroid of the
scatterplot of
and
at that value. The
axis coordinate
of the centroid is
, and the
axis coordinate is
.
Knowing
and
for all
, one can find the ratio of their
maxima to recover
with Eqn. 9, assuming
that
attains its maxima at
, and that
attains its maxima
at
. With this information, we define a mapping
from data value to an approximate position along a boundary:
Roughly speaking,
tells us on which side of the nearest
boundary a data value
tends to fall. For values closer to
,
will be negative; for values closer to
,
will be positive. In practice, we have found it useful to
modify Eqn. 11 to account for the fact that the
gradient magnitude at the interior of materials is rarely exactly
zero. Knowing how it differs from zero is again a matter of
experience, but assuming one can find a
which approximates
the ambient gradient magnitude, Eqn. 11 is
re-formulated, with a slight loss of mathematical accuracy, as
![]() |
(12) |
The user supplies the last piece of information needed: a function
we term the boundary emphasis function, which maps from
position along a boundary to opacity. As the intent is to make only
boundaries visible in the rendering,
should be non-zero only
near zero. For this reason, we have not been especially careful to
prevent
from attaining infinite values due to a low
;
such a data value
should not contribute to the final image. With
, the user can directly control whether rendered boundaries will
appear thick or thin, sharp or fuzzy, and the proximity of the
rendered boundary to the object interior. The final opacity function
is then defined as
Instead of exploring the parameter space of all possible opacity
functions, the user explores the parameter space of
and lets
the information from the histogram volume, embodied in
,
constrain the search to those opacity functions which display object
boundaries. Defining opacity as a function of position within a
boundary then becomes a more intuitive task than defining opacity as a
function of data value, as there is a more predictable relationship
between changes made to the boundary emphasis function and the
corresponding change in rendered results. As there is a potential for
inaccuracy in the calculation of
from Eqn. 9,
the user may need to experiment with different scalings in the domain
of
. Fig. 11 shows how the choice of boundary
emphasis function affects the opacity function and the rendered image,
for a synthetically created dataset containing two concentric spheres
at distinct data values. It should be stressed that the user does not
set the location of the peaks in
, since this is determined
by the information in
, but the user can influence the location,
as well as the width, height, and shape of the peaks.
This is the
main benefit of this method: if the histogram volume has successfully
captured information about the boundaries in the dataset, the user
enjoys high-level control over the character of the rendered
boundaries without having to worry about the exact specification of
. Yet, the
so generated is sensible enough
that it could be edited by hand if desired. For example, since this
technique will attempt to make all boundaries opaque, a useful
supplement to the interface would be a feature which allows supression
of the peaks in
for one or more boundaries.
Even though we have made some strong assumptions about the boundary
characteristics in the volume dataset, the technique described here
typically works well even if the material boundaries are not
``ideal''. Essentially, by taking the ratio of the second and first
derivatives, and by having
assign opacity to positions around
zero, we are more apt to make opaque those data values associated with
both low second derivatives and high first derivatives. Or, even if
is not a perfect indicator of ``position relative to
boundary'', the sign change in
around its zero-crossing affords us some control over whether we want
to emphasize regions closer to or further from the object's interior.
Fig. 12 (colorplate) on the
accompanying colorplate shows a rendering of an MRI dataset which does
not have ideal boundaries but for which this technique still works.
So far the opacity functions under consideration have assigned opacity based on data value alone. Higher quality renderings can sometimes be obtained, however, if the opacity is assigned as a function of both data value and gradient magnitude. Defining these two-dimensional opacity functions by hand is especially challenging because there are even more degrees of freedom than in one-dimensional, value-based opacity functions. Fortunately, the ideas presented so far easily generalize to allow semi-automatic generation of two-dimensional opacity functions.
Analogous to the definition of
, we define
to be
average second derivative over all locations where the data value is
and the gradient magnitude is
; this is also easily calculated
from the histogram volume. We similarly define a new position
function, and from that an opacity function:
is calculated as before; the ratio of the extremum of the
average first and second derivatives. The benefit of this kind of
opacity function is that it can distinguish between boundaries that
have overlapping ranges of values. For instance, the nested cylinders
volume in Fig. 9 and the engine block volume in
Fig. 10 each have one boundary which overlaps the
two other boundaries in data value, spanning from the higher of the
two material values to the background value. Selectively rendering
this single boundary is impossible with a value-based opacity
function, but because the boundary has a distinct curve in the plot of
data value versus first derivative, it is possible to create an
opacity function which selects only the voxels comprising this
boundary. As it did in the case of value-based opacity functions, the
technique presented here will generate two-dimensional opacity
functions which make all detected boundaries opaque; a simple
``lasso'' tool could then be used to select different regions in the
two-dimensional opacity function to render one boundary at a time. In
Fig. 13 (colorplate), the feet of the female Visible Human CT
dataset [17] are rendered with four different two-dimensional
opacity functions. Using a modification of an automatically generated
opacity function, one rendering shows almost exclusively the
registration cord laced around the body prior to scanning.
The lower right rendering in Fig. 13 demonstrates another advantage of
two-dimensional opacity functions -- the ability to accurately render
the surface of a material which attains a wide range of data values,
as is the case for the bone tissue in this same CT scan. Different
parts of the bone surface are more radio-opaque than others, leading
to a wide range of data values associated with bone, which in turn
causes a wide range of gradient magnitudes within the boundary region
between bone and soft tissue. Knowing the average second derivative
for each location in
space, we can make opaque only those
voxels near the middle of the boundary (near the zero-crossing in
), regardless of the bone data value. As is visible in the
opacity function generated with Eqn. 14, this implies
that as gradient magnitude increases, there is an upward shift in the
data values which should be made most opaque. This kind of careful
opacity assignment is not possible with a simple value-based opacity
function, though it is reminiscent of the two-dimensional opacity
functions described by Levoy [11]. Although space does not
permit a detailed comparison between our approach and Levoy's, the
main difference is that (ideally) the measured first and second
derivative information serves to constrain the opacity function
generation so as to only show boundaries, while in Levoy's method the
user still has to experiment to find the right parameter settings.