The Division of Imaging and Applied mathematics in the FDA uses a detailed Monte Carlo x-ray simulation package, PENELOPE, to study and evaluate existing and experimental x-ray devices. penVT is a user interface program that works in conjunction with PENELOPE to easily simulate a full scan of an experimental tomosynthesis device. The user inputs various parameters of the device, such as rotation radius, the number of projections, etc. along with a voxelized model (phantom) of the subject, and penVT will prepare a set of PENELOPE simulations which correspond to the projections in the scan. Once the PENELOPE simulations have been run, the final output is a set of projection images from the scan, which can be studied for image quality or reconstructed in to a 3D view. Documentation for penVT can be found here.
penCT is a sister program to penVT and helps users easily simulate computed tomography (CT) scans with PENELOPE. While the underlying principal is the same, the detector in a CT scanner rotates along with the source. Since a CT scan will usually cover much more of the patient’s body than a tomosynthesis scan, the phantoms used in penCT are often much larger than for penVT. Therefore, in addition to voxelized phantoms, penCT allows for 3D mesh phantoms as well. penCT allows for the simulation of full or partial rotations for a single slice as well as full helical scans. Documentation for penCT can be found here.
organ_boundaries / smoothdecimate
When running x-ray simulations on realistic phantoms, the RAM of the system is a limiting factor of the detail of the phantom, even in high-powered computing clusters. The organ_boundaries and smoothdecimate programs help minimize these problems by converting large voxelized phantoms into comparable 3D meshes of a much smaller file size.
The organ_boundaries program converts a segmented and labeled voxel phantom — like you might obtain from a CT or MRI — into a set of 3D meshes of the phantom’s organs. This program uses the marching cubes algorithm to wrap a mesh around the appropriate voxels. This creates a large mesh with a blocky appearance like the middle figure in the image to the right.
The smothdecimate program takes the large, blockly mesh from the organ_boundaries output and smooths out the surfaces while also reducing the total number of triangles in the mesh. To accomplish this, the program uses two filters: a Sinc filter that smooths the sharp edges in the phantom while maintaining the topology, and a decimate filter that merges triangles that are nearly coplanar to reduce the total triangle count. smoothdecimate applies this filters alternately multiple times to create a final mesh that is smoother and as little as 10% of the original size.
kRenderer is a full rendering program that was built from scratch in Java for the Graphics II course at George Washington University. The only Java graphics functions used by kRenderer is the ability to draw a line to the screen and load an image (for texture mapping). The program loads three-dimensional meshes in the simple *.D format, transforms the points into world coordinates, view coordinates, and finally normalized perspective coordinates based on parameters that can be set in the simple GUI. Finally, the image is drawn to the screen either as a wireframe outline or by scan converting the mesh into fragments which are ordered by the z-buffer algorithm. kRenderer includes the ability to render two meshes with occlusion using flat, Gouraud, or Phong shading and texture mapping. The full project write up can be found here.