Source code for bacteria_density.process

import numpy as np
from skimage.measure import label, regionprops
from skimage.morphology import dilation
from scipy.spatial import KDTree
import tifffile as tiff
import os

[docs] def keep_largest(mask): """ Searches for the biggest connected component within a binary mask and isolates it. The input image is not modified. Args: - mask (np.ndarray): An image encoded on uint8 containing only 0 and 1. Returns: (np.ndarray) """ labeled = label(mask) all_props = regionprops(labeled) biggest_size = -1 biggest_lbl = 0 for props in all_props: if int(props.label) == 0: continue if props.area > biggest_size: biggest_size = props.area biggest_lbl = props.label return np.asarray(labeled == biggest_lbl, dtype=np.uint8)
[docs] def make_affectations(mask, path): kd = KDTree(path) all_pts = np.where(mask > 0) all_pts = np.array(list(zip(*all_pts))) _, indices = kd.query(all_pts) affectations = {} for i, (z, y, x) in zip(indices, all_pts): affectations[(z, y, x)] = i return affectations
[docs] def control_affectations(mask, affectations): control = np.zeros_like(mask, dtype=np.uint32) for (z, y, x), i in affectations.items(): control[z, y, x] = i + 1 return control
[docs] def make_metric_control(values, bins_indices, med_path, shape, metric, region_folder): control = np.zeros(shape, dtype=np.float32) for i in range(len(bins_indices) - 1): start = bins_indices[i] end = bins_indices[i + 1] for j in range(start, end): z, y, x = med_path[j] control[z, y, x] = values[i] control = dilation(control, np.ones((3,7,7), dtype=np.uint8)) output_folder = os.path.join(region_folder, "ctrl-metrics") os.makedirs(output_folder, exist_ok=True) output_path = os.path.join(output_folder, f"{metric.replace(' ', '_').lower()}.tif") tiff.imwrite(output_path, control)