Working with Artery Anatomy Filler in Medical Visualization
I picked up Artery Anatomy Filler back when I was trying to build patient-specific vascular models for pre-surgical planning. The tool does one thing: it fills lumen spaces in segmented artery data so you get clean, watertight mesh volumes instead of hollow shell surfaces. That sounds trivial until you're dealing with contrast CT scans that have noisy boundaries and calcified plaque casting artifacts all over the place. The workflow isn't as straightforward as loading a file and hitting generate. Here's how I actually use it day to day. First, you need clean segmentation data. I run my DICOM through a thresholding pass in 3D Slicer, isolate the arterial lumen, and export the surface as an STL or PLY. If your original segmentation has holes, pores, or disconnected components from partial volume effects, the filler will either fail silently or produce garbage geometry. I always check the mesh beforehand by running a non-manifold edge detection pass. Takes about three minutes but saves me from hunting down why the fill result looks like a Swiss cheese model.
Getting Started with Artery Anatomy Filler
Once your mesh is clean, open the filler application. The interface is minimal — you import your artery mesh, set the fill parameters, and run it. The key settings are fill tolerance and surface closure threshold. Tolerance controls how far the algorithm will bridge gaps, and the closure threshold determines which openings are considered noise versus anatomical features you want to preserve. Here's where people mess up: they crank the tolerance up to 5mm because they think that will handle all the artifacts. It won't. You get inflated geometries that push into surrounding tissue space, which ruins anything downstream like CFD simulations or finite element stress analysis. I keep tolerance at 1-2mm and closure threshold at 3-5mm for most coronary and carotid work. For peripheral arteries with larger diameter vessels, I bump tolerance to 2-3mm. The exact numbers depend on your voxel resolution too. If you're working with 0.5mm isotropic voxels, those thresholds apply directly. At 1.0mm, you should roughly double them. I learned that the hard way on a femoral artery case where the fill blew past the vessel boundary and merged two adjacent branches into a single blob. After you run the fill, export the result as OBJ or STL and do a quick volume check. Compare the filled volume against your original segmented lumen volume. A 2-5% increase is normal — that's the gap bridging doing its job. If you see a 15% or higher volume change, something went wrong. Go back and tighten your parameters or fix the source mesh. This volume validation step usually catches issues in under a minute.
One thing the documentation doesn't emphasize enough: Artery Anatomy Filler assumes your vessel mesh is oriented consistently. If you have segments imported from different scan angles or stitched from multiple ROI crops, the inward-facing normals will be inconsistent and the fill algorithm gets confused about which side is the lumen. I fixed this by running a reorientation pass in MeshLab after stitching, using the "Recompute Normalized Face Normals" filter before importing into the filler. Without that step, I was getting partial fills where half the vessel came out hollow and half came out solid, which is exactly the kind of problem that ruins a simulation. The tool also doesn't handle bifurcations well when the branching angles are acute — anything under 45 degrees tends to produce excess material at the junction point. My workaround is to segment the parent vessel and each branch separately, fill them individually, then Boolean union them afterward with a 1mm merge distance. It adds about twenty minutes to the pipeline but the geometry is significantly cleaner than letting the filler handle the bifurcation natively. There's a download page on the Artery Anatomy Filler site if you want to try it yourself. It's freeware for non-commercial academic use, though they do ask for an institutional email to get the full version. The free tier limits you to meshes under 500K triangles, which is fine for single vessel segments but becomes a bottleneck when you're working with full circulatory tree models from aortic arch to iliac bifurcation. In those cases I split the anatomy into regions, process each region separately, and stitch the outputs together.
Get the Full Details

The biggest limitation I run into is with heavily calcified vessels. Calcification creates dense hyperattenuating regions that segmentation tools often include as part of the lumen mask, which means your input mesh already has irregular, jagged inner surfaces where the calcium deposits are. The filler will try to smooth over those as if they were just noise, which physically misrepresents the true lumen geometry. For these cases I manually carve out the calcified regions in the segmentation step before filling, or I switch to using a different approach entirely — direct volumetric filling of the DICOM mask rather than surface-based filling. The volumetric route preserves the actual lumen boundaries better but requires more manual editing upfront. Processing time scales roughly with triangle count and chosen tolerance. A typical coronary artery segment with 80K triangles and 1.5mm tolerance takes about forty seconds to fill on a standard workstation with a mid-range GPU. Full aortic arch models with 400K+ triangles push that to three to five minutes. CPU-only mode is available but expect ten times that duration. Not worth it unless you don't have a graphics card. I've been using this for about two years now across cardiac, cerebrovascular, and peripheral vascular cases. It's not a silver bullet, and it breaks down on anything with severe pathology that fundamentally distorts the vessel geometry. But for routine lumen filling on reasonably clean segmentation data, it's faster than doing it manually in any mesh editor and produces results good enough for visualization and most simulation purposes.