Source code for palmari.image_tools.cell_mask

import numpy as np
from scipy.ndimage.morphology import binary_dilation
from skimage.filters import gaussian, threshold_otsu
from skimage.morphology import closing, square, remove_small_objects, convex_hull_object
from skimage.segmentation import clear_border
from skimage.measure import label
import pandas as pd
from scipy.stats import binned_statistic_2d
import matplotlib.pyplot as plt


[docs]def get_cell_mask(data: np.ndarray): data_max = .5*(np.max(data[::10], axis=0) + np.mean(data[::10], axis=0)) gblur = gaussian(data_max, sigma=4) threshold = threshold_otsu(gblur) #plt.figure() #plt.imshow(gblur) bw = closing(gblur > threshold, square(4)) #plt.figure() #plt.imshow(bw) extra_width = 5 bw = binary_dilation(bw, iterations=extra_width) #plt.figure() #plt.imshow(bw) cleared = remove_small_objects(bw, 100) #plt.figure() #plt.imshow(cleared) convex_image = convex_hull_object(cleared, connectivity=2) label_image = label(convex_image).astype(int) return label_image
[docs]def tag_localizations_per_cell(pos: pd.DataFrame, labels: np.ndarray, scale: float): XY = pos[["x", "y"]].values/scale cell = pd.Series(data=np.zeros(pos.shape[0])) _, _, _, bins = binned_statistic_2d(x=XY[:, 0], y=XY[:, 1], values=np.ones_like(XY[:,0]), bins=( np.arange(labels.shape[0]+1), np.arange(labels.shape[1]+1))) flat_labels = np.reshape(labels, (-1,)) for l in np.unique(labels): if l == 0: continue good_bins = np.where(flat_labels == l) cell.loc[np.isin(bins,good_bins)] = l return cell