Source code for spateo.segmentation.simulation_evaluation.prepare

import os

import cv2
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

mpl.rcParams["pdf.fonttype"] = 42


[docs]def get_fb_dis(image_tif, labels_tif): data = cv2.imread(image_tif, 2) labels = cv2.imread(labels_tif, 2) cell_sigs = np.bincount(data[labels > 0]) / np.sum(labels > 0) bg_sigs = np.bincount(data[labels == 0]) / np.sum(labels == 0) # fig, ax = plt.subplots() # ax.bar(range(len(cell_sigs)), cell_sigs, label="cell", alpha=0.6, color="red") # ax.bar(range(len(bg_sigs)), bg_sigs, label="bg", alpha=0.6, color='blue') # ax.set_xlabel("signal intensity") # ax.set_ylabel("density") # plt.legend() # plt.savefig("sig.dis.pdf") if len(bg_sigs) < len(cell_sigs): bg_sigs = list(bg_sigs) bg_sigs.extend([0 for i in range(len(cell_sigs) - len(bg_sigs))]) if len(bg_sigs) > len(cell_sigs): cell_sigs = list(cell_sigs) cell_sigs.extend([0 for i in range(len(bg_sigs) - len(cell_sigs))]) stat_df = pd.DataFrame({"signal": range(len(cell_sigs)), "cell_sigs": cell_sigs, "bg_sigs": bg_sigs}).set_index( "signal" ) return stat_df
[docs]def cell_area_dis(labels_tifs): all_areas = [] for labels_tif in labels_tifs: labels = cv2.imread(labels_tif, 2) all_areas.extend(list(np.bincount(labels.flatten())[1:])) all_areas = np.array(all_areas) all_areas = all_areas[all_areas > 0] area_dis = np.bincount(all_areas) area_df = pd.DataFrame({"area": range(len(area_dis)), "cell_num": area_dis, "prob": area_dis / np.sum(area_dis)}) # fig, ax = plt.subplots() # ax.bar('area', 'cell_num', data=area_df) # ax.set_xlabel('area') # ax.set_ylabel('cell number') # plt.savefig("cell_area.dis.pdf") return area_df
[docs]def c_to_a_ratio_dis(labels_tif): labels = cv2.imread(labels_tif, 2) cell_labels = [i for i in np.unique(labels) if i > 0] ratios = [] for c in cell_labels: one = np.where(labels == c, 1, 0).astype(np.uint8) contours, _ = cv2.findContours(one, mode=cv2.RETR_EXTERNAL, method=cv2.CHAIN_APPROX_NONE) per = cv2.arcLength(contours[0], True) area = np.sum(one == 1) ratios.append(per / area) ratios = np.array(ratios) return ratios
[docs]def ltos_ratio_dis(labels_tifs): ratios = [] for labels_tif in labels_tifs: labels = cv2.imread(labels_tif, 2) cell_labels = [i for i in np.unique(labels) if i > 0] for c in cell_labels: one = np.where(labels == c, 1, 0).astype(np.uint8) contours, _ = cv2.findContours(one, mode=cv2.RETR_EXTERNAL, method=cv2.CHAIN_APPROX_NONE) rect = cv2.minAreaRect(contours[0]) if rect[1][0] * rect[1][1] == 0: continue ltos = np.max(rect[1]) / np.min(rect[1]) ratios.append(ltos) ratios = np.array(ratios) return ratios
[docs]def get_fb_dis_window(image_tif, labels_tif, win=200): data = cv2.imread(image_tif, 2) labels = cv2.imread(labels_tif, 2) c = 0 cell_df = None bg_df = None for i in range(0, data.shape[0], win): for j in range(0, data.shape[1], win): d = data[i : i + win, j : j + win] l = labels[i : i + win, j : j + win] cell_sigs = np.bincount(d[l > 0]) / np.sum(l > 0) bg_sigs = np.bincount(d[l == 0]) / np.sum(l == 0) cell_one_df = pd.DataFrame({"signal": range(len(cell_sigs)), "cell_sigs": cell_sigs}).set_index("signal") bg_one_df = pd.DataFrame({"signal": range(len(bg_sigs)), "bg_sigs": bg_sigs}).set_index("signal") if c == 0: cell_df = cell_one_df bg_df = bg_one_df if c > 0: cell_df = pd.concat((cell_df, cell_one_df), axis=1) bg_df = pd.concat((bg_df, bg_one_df), axis=1) c += 1 cell_df = cell_df.fillna(0).T bg_df = bg_df.fillna(0).T cell_mean_df = pd.DataFrame({"prob": cell_df.mean(axis=0)}) bg_mean_df = pd.DataFrame({"prob": bg_df.mean(axis=0)}) return cell_df, bg_df, cell_mean_df, bg_mean_df