Academic work
Microscopy image processing and 3D reconstruction
A Python pipeline for confocal microscopy data. It reads Zeiss CZI z-stacks and their metadata, applies composable filters, segments the volume, and reconstructs a surface mesh that exports as STL. An interactive viewer sits on top of it, and its frame rate is instrumented.
The problem
A z-stack is a volume rather than a picture, and what the people using it need out of it is a shape. Real microscope files arrive with their own metadata conventions, and the volumes are large enough that direct convolution is too slow to keep the viewer interactive.
The output is an STL: a stack of fluorescence images becomes a watertight surface that can be printed or measured.
The course ran in the second half of the first semester of 2025/2026, so the months are that block rather than recorded dates.
What this demonstrates
Learning the domain before building for itcore
Fluorescence microscopy was new to me. Before I could write anything useful I had to learn how CZI stacks and their metadata are organised, what the DAPI and GFP channels hold, and enough about iso-levels to settle on triangle thresholding for the surface extraction.
Measuring instead of assertingcore
Filtering goes through FFT convolution rather than direct convolution. I instrumented the viewer's frame rate with a timer that writes a benchmark file, moving average in one column and instantaneous in the other, so the speed is measured rather than judged by eye.
Implementing the primitives rather than importing themsupporting
Filters compose through a factory that returns chainable functions over raw FFT convolution, and the volumetric path runs marching cubes and then smooths, decimates and exports the mesh. I built that path rather than calling a one-shot conversion.
Building around how the work is actually donesupporting
I wrapped the pipeline in a GUI, because the people who need the output are not going to run Python to get it.
Built with
Pythoncore
The pipeline, the viewer and the benchmarking.
NumPy / SciPycore
Array handling and FFT-based convolution for the filter stage.
scikit-imagesupporting
Thresholding and the marching-cubes surface extraction behind the mesh export.