All posts
Research 2026-02-18 · 7 min read

Segmenting Actin Filaments in Noisy Cryo-ET Tomograms

Segmenting Actin Filaments in Noisy Cryo-ET Tomograms

Cryo-electron tomography (cryo-ET) gives us 3D views of the cellular interior, but at a price: the reconstructions are noisy, anisotropic, and often only mid-resolution. When you point a vanilla 3D U-Net at this data and ask it to trace actin filaments, the results degrade fast as the signal-to-noise ratio (SNR) drops.

This post sketches the problem and the voxel-leveling preprocessing step I've been working on.

The problem in one picture

A filament that is crisp at high SNR dissolves into speckle at low SNR. The model's receptive field starts "seeing" noise as structure:

At SNR below ~0.1, intensity-based features become nearly uninformative. The network has to lean on geometry and continuity instead of raw voxel values.

Voxel leveling

The core idea is to normalize local intensity statistics before the network ever sees a voxel, so that the same filament looks consistent across regions with different noise floors.

import numpy as np
from scipy.ndimage import uniform_filter

def voxel_level(volume: np.ndarray, window: int = 9, eps: float = 1e-6):
    """Local mean/variance normalization for cryo-ET volumes."""
    mean = uniform_filter(volume, size=window)
    sq   = uniform_filter(volume ** 2, size=window)
    var  = np.clip(sq - mean ** 2, 0, None)
    return (volume - mean) / np.sqrt(var + eps)

A quick sanity check on a synthetic tomogram:

vol = np.random.randn(64, 64, 64) * 0.3
vol[30:34, :, 20] += 2.0          # inject a "filament"
leveled = voxel_level(vol)
print(leveled.mean(), leveled.std())   # ≈ 0.0, ≈ 1.0 locally

How the architectures compare

I benchmarked a few segmentation backbones across noise levels. Dice score (higher is better):

Architecture SNR 0.5 SNR 0.2 SNR 0.1
3D U-Net 0.88 0.71 0.49
Attention U-Net 0.90 0.76 0.55
U-Net + leveling 0.91 0.83 0.68

The gap widens as noise increases — exactly where robustness matters most.

Takeaways

  1. Mid-resolution cryo-ET needs preprocessing that respects local statistics, not global normalization.
  2. A cheap, non-learned step (voxel_level) can buy more robustness than a fancier decoder.
  3. Always report performance across the noise axis, not just at one comfortable SNR.

Note

Code and the full BIBM 2025 evaluation are linked from the Publications page.

Next up: extending this to protein secondary-structure segmentation, where the geometric priors are very different.

More posts