Cryo-ET Segmentation

Cryo-Electron Tomography (cryo-ET) segmentation module provides specialized tools for identifying and segmenting cellular structures in cryo-electron tomography data, optimized for filamentous structures like actin networks.

Core Segmentation API

Cryo-ET segmentation now uses the unified Segmenter API.

Recommended Usage (Unified API):

from ipa.processing.segmentation import ETFilamentSegmenter, ETMembraneSegmenter

# Filament Detection (Actin/Microtubules)
filament_seg = ETFilamentSegmenter(device='cuda')
filament_seg.load_model()
results = filament_seg.predict(volume)

# Membrane Segmentation
membrane_seg = ETMembraneSegmenter(device='cuda')
membrane_seg.load_model()
results = membrane_seg.predict(volume)

For detailed API documentation, see Segmentation Module.

Parameters:

  • image_data (numpy.ndarray): Input cryo-ET image volume (3D)

  • gaussian_sigma (float, optional): Gaussian smoothing for noise reduction (default: 1.5)

  • threshold_multiplier (float, optional): Threshold adjustment for binarization (default: 1.0)

  • erosion_radius (int, optional): Morphological erosion radius (default: 1)

  • min_object_size (int, optional): Minimum object size to retain (default: 100)

  • dilation_radius (int, optional): Morphological dilation radius (default: 1)

  • min_skeleton_size (int, optional): Minimum skeleton fragment size (default: 20)

  • max_connect_distance (int, optional): Maximum distance for connecting fragments (default: 8)

  • final_min_size (int, optional): Final minimum structure size (default: 10)

Returns:

  • numpy.ndarray: 3D skeleton image showing extracted filamentous structures

Example Usage

Basic CryoET Actin Skeletonization

from ipa.processing.segmentation import skeletonization_et_segmentation
from ipa.data_loader import UniversalDataLoader

# Load denoised cryoET data
image_data = UniversalDataLoader.load_data("denoised_tomogram.mrc")

# Perform ET-optimized actin skeletonization
skeleton_result = skeletonization_et_segmentation(
    image_data,
    gaussian_sigma=1.5,          # Noise reduction for cryoET
    threshold_multiplier=1.0,    # Conservative threshold
    min_object_size=100,         # Filter small noise objects
    max_connect_distance=8       # Connect filament segments
)

print(f"Skeleton points detected: {np.sum(skeleton_result > 0)}")

Processing with Custom Parameters

# Fine-tuned for high-resolution actin networks
skeleton_advanced = skeletonization_et_segmentation(
    image_data,
    gaussian_sigma=2.0,          # More smoothing for noisy data
    threshold_multiplier=0.8,    # Lower threshold for faint structures
    erosion_radius=2,            # Stronger noise removal
    min_object_size=50,          # Detect smaller structures
    min_skeleton_size=15,        # Keep shorter segments
    max_connect_distance=12,     # Longer connection range
    final_min_size=8             # Retain fine details
)

Complete Processing Pipeline

import numpy as np
import tifffile
from pathlib import Path

# Load and process cryoET data
data_path = "cryoET_data/sample_denoised.mrc"
image_data = UniversalDataLoader.load_data(data_path)

# ET segmentation
skeleton = skeletonization_et_segmentation(image_data)

# Save results
output_dir = Path("results/")
output_dir.mkdir(exist_ok=True)
tifffile.imwrite(output_dir / "actin_skeleton.tif",
                 skeleton.astype(np.uint8) * 255)

# Extract coordinates for analysis
coords = np.where(skeleton > 0)
with open(output_dir / "skeleton_coords.txt", 'w') as f:
    f.write("Z\tY\tX\n")
    for i in range(len(coords[0])):
        f.write(f"{coords[0][i]}\t{coords[1][i]}\t{coords[2][i]}\n")