CS 788H S01 Project  Gradient Estimators
 Intermediate Difference  Central Difference  ZuckerHummel  Sobel 3D  Comparision Images 
Estimating the gradient properly can be a difficult task because of the inherent noise in volume data. This is noise is especially exacerbated when computing directional derivatives (especially the second directional derivative). Thus I thought it proper to write an adequate gradient estimator first. To compute the gradient all one needs to do is to compute the partial derivative for each axis, ie.
I have experimented with four gradient operators:
Intemediate Difference Operator
Central Different Operator
ZuckerHummel Operator
Sobel 3D Operator
Intermediate Difference Operator
The intermediate difference operator is a really simple
operator, for each axis, we look at one neighbour and the value at the current
voxel thus giving a total of voxels to sample from.
The operator for the x axis is:
We just extend the idea for the y and z axis.
From my experience this operator provided the least desirable images.
The central difference operator is similar to the intermediate difference operator except that we now look at 2 neighbours and igore the value at the current voxel. Thus we sample from 6 neighbours. The operator for the x axis is:
Again we extend the idea for the y and z axis.
From experience this operator provides acceptable results considering it is over 4 times faster than ZuckerHummel or Sobel 3D.
The ZuckerHummel operator looks at all 27 neighbours in a 3x3x3 grid. I could not find the original paper describing this operator, thus my implementation is based off of the implementation as descrived in "Confocal Volume Rendering: Fast SegmentationFree Visualization of Internal Structures" by Mullick et al.
You find their description at the end of their paper.
It is worth noting that the description provided by Mullick et al. contains a terrible number of errors. Be very careful when using their equations. Thanks to various readers who pointed out the errors in their operator.
The ZuckerHummel operator smoothes out the gradients much better than the Central Difference.
The Sobel 3D operator applies a 3x3x3 kernel to compute each of
the partial derivatives.
The kernel for the x direction that I used is:


x1 
x 
x+1 
To obtain the kernel for the y and z directions we just rotate this kernel as required
Thus the kernel for y becomes:
y1  y  y+1 
And the kernel for z becomes:
z1  z  z+1 
From my experience the Sobel 3D operator provides not only the most 'correct' gradients but the filtering properties of the kernel are very effective in reducing noise and aliasing artefacts.
In order to compare these various gradient estimators I have rendered the CT Visible Human data set with an ISO renderer. The parameters for my render are as follows:
CLICK ON THE IMAGES TO VIEW THE FULL VERSION
UPDATE: The images generated for the ZuckerHummel operator are not correct since various bugs in the code have been fixed, yet images not rerendered.
Nearest Neighbour Filtering
Trilinear Filtering