Source code for ark.segmentation.signal_extraction

import numpy as np


[docs]def positive_pixels_extraction(cell_coords, image_data, **kwargs): """Extract channel counts by summing over the number of non-zero pixels in the cell. Args: cell_coords (numpy.ndarray): values representing pixels within one cell image_data (xarray.DataArray): array containing channel counts **kwargs: arbitrary keyword arguments Returns: numpy.ndarray: Sums of counts for each channel """ # index into image_data channel_values = image_data.values[tuple(cell_coords.T)] # create binary mask based on threshold channel_counts = np.sum(channel_values > kwargs.get('threshold', 0), axis=0) return channel_counts
[docs]def center_weighting_extraction(cell_coords, image_data, **kwargs): """Extract channel counts by summing over weighted expression values based on distance from center. Args: cell_coords (numpy.ndarray): values representing pixels within one cell image_data (xarray.DataArray): array containing channel counts **kwargs: arbitrary keyword arguments Returns: numpy.ndarray: Sums of counts for each channel """ # compute the distance box-level from the center outward weights = np.linalg.norm(cell_coords - kwargs.get('centroid'), ord=np.inf, axis=1) # center the weights around the middle value weights = 1 - (weights / (np.max(weights) + 1)) # retrieve the channel counts channel_values = image_data.values[tuple(cell_coords.T)] channel_counts = weights.dot(channel_values) return channel_counts
[docs]def total_intensity_extraction(cell_coords, image_data, **kwargs): """ Extract channel counts for an individual cell via basic summation for each channel Args: cell_coords (numpy.ndarray): values representing pixels within one cell image_data (xarray.DataArray): array containing channel counts **kwargs: arbitrary keyword arguments Returns: numpy.ndarray: Sum of counts for each channel """ # index into image_data to get the channel values we're interested in channel_values = image_data.values[tuple(cell_coords.T)] # collapse along channels dimension to get counts per channel channel_counts = np.sum(channel_values, axis=0) return channel_counts
EXTRACTION_FUNCTION = { 'positive_pixel': positive_pixels_extraction, 'center_weighting': center_weighting_extraction, 'total_intensity': total_intensity_extraction, }