Source code for cellcomplex.property_topomesh.utils.label_image_tools

import numpy as np
import scipy.ndimage as nd

from copy import deepcopy


[docs]def euclidean_sphere(radius, voxelsize=(1,1,1)): x,y,z = np.mgrid[-radius/float(voxelsize[0]):radius/float(voxelsize[0])+1, -radius/float(voxelsize[1]):radius/float(voxelsize[1])+1, -radius/float(voxelsize[2]):radius/float(voxelsize[2])+1] distance = np.linalg.norm([x*float(voxelsize[0]),y*float(voxelsize[1]),z*float(voxelsize[2])],axis=0) return (distance<=radius).astype(np.uint8)
[docs]def label_median_filter(img,radius=1): sphere = euclidean_sphere(radius,voxelsize=img.voxelsize) # print sphere.sum() from time import time start_time = time() print("--> Counting labels inside spherical neighborhoods...") image_labels = np.unique(img) count_max = np.zeros_like(img).astype(int) filtered_img = deepcopy(img) for l in image_labels: label_start_time = time() print(" --> Cell ",l) label_img = (img==l).astype(int) label_coords = np.where(label_img) bbox = (np.maximum([0,0,0],np.min(label_coords,axis=1)-(radius/np.array(img.voxelsize)).astype(int)), np.minimum(np.array(img.shape)-1,np.max(label_coords,axis=1)+(radius/np.array(img.voxelsize)).astype(int))) print(bbox) label_count = np.zeros_like(img).astype(int) label_count[bbox[0][0]:bbox[1][0],bbox[0][1]:bbox[1][1],bbox[0][2]:bbox[1][2]] = nd.filters.convolve(label_img[bbox[0][0]:bbox[1][0],bbox[0][1]:bbox[1][1],bbox[0][2]:bbox[1][2]],sphere) # print " ",(label_count>count_max).sum()," voxels changed" filtered_img[label_count>count_max] = l count_max = np.max([count_max,label_count],axis=0) label_end_time = time() #print " <-- Cell ",l," : ",np.round(label_img.sum()*np.prod(img.voxelsize),2)," microm3 [",label_end_time-label_start_time,"s]" print(" <-- Cell ",l," [",label_end_time-label_start_time,"s]") end_time = time() print("<-- Counting labels inside spherical neighborhoods [",end_time-start_time,"s]") return filtered_img