def read_image(im_info, ids='segm/labels_memb_del', imtype='Label'): """"Read a h5 dataset as Image object.""" fname = '{}_{}'.format(im_info['base'], im_info['postfix']) fstem = os.path.join(im_info['datadir'], fname) if imtype == 'Label': im = LabelImage('{}.h5/{}'.format(fstem, ids)) elif imtype == 'Mask': im = MaskImage('{}.h5/{}'.format(fstem, ids)) else: im = Image('{}.h5/{}'.format(fstem, ids)) im.load(load_data=False) if imtype == 'Label': im.set_maxlabel() return im
def write(out, outstem, postfix, ref_im, imtype='Image'): """Write an image to disk.""" outstem = outstem or gen_outpath(ref_im, '') outpath = '{}{}'.format(outstem, postfix) props = ref_im.get_props() props['dtype'] = out.dtype if imtype == 'Label': mo = LabelImage(outpath, **props) elif imtype == 'Mask': mo = MaskImage(outpath, **props) else: mo = Image(outpath, **props) mo.create() mo.write(out) if imtype == 'Label': mo.set_maxlabel() mo.ds.attrs.create('maxlabel', mo.maxlabel, dtype='uint32') return mo
def csv_to_im( image_in, csv_path, labelkey='label', key='dapi', name='', maxlabel=0, normalize=False, scale_uint16=False, replace_nan=False, channel=-1, outpath='', ): """Write segment backprojection.""" if isinstance(image_in, Image): labels = image_in else: labels = LabelImage(image_in) labels.load(load_data=False) if not maxlabel: labels.set_maxlabel() maxlabel = labels.maxlabel if csv_path.endswith('.csv'): df = pd.read_csv(csv_path) df = df.astype({labelkey: int}) elif csv_path.endswith('.h5ad'): import scanpy as sc adata = sc.read(csv_path) if not csv_path.endswith('_nofilter.h5ad'): adata.X = adata.raw.X df = adata.obs[labelkey].astype(int) df = pd.concat([df, adata[:, key].to_df()], axis=1) # for key in keys: # TODO fw = np.zeros(maxlabel + 1, dtype='float') for index, row in df.iterrows(): fw[int(row[labelkey])] = row[key] if replace_nan: fw = np.nan_to_num(fw) if normalize: def normalize_data(data): """Normalize data between 0 and 1.""" data = data.astype('float64') datamin = np.amin(data) datamax = np.amax(data) data -= datamin data *= 1 / (datamax - datamin) return data, [datamin, datamax] fw_n, fw_minmax = normalize_data(fw) fw_n *= 65535 fw = fw_n elif scale_uint16: # for e.g. pseudotime / FA / etc / any [0, 1] vars fw *= 65535 out = labels.forward_map(list(fw)) if outpath.endswith('.ims'): mo = Image(outpath, permission='r+') mo.load(load_data=False) if channel >= 0 and channel < mo.dims[3]: ch = channel else: mo.create() ch = mo.dims[3] - 1 mo.slices[3] = slice(ch, ch + 1, 1) mo.write(out.astype(mo.dtype)) # FIXME: >65535 wraps around cpath = 'DataSetInfo/Channel {}'.format(ch) name = name or key mo.file[cpath].attrs['Name'] = np.array([c for c in name], dtype='|S1') mo.close() elif outpath.endswith('.nii.gz'): props = labels.get_props() if not labels.path.endswith('.nii.gz'): props = transpose_props(props, outlayout='xyz') out = out.transpose() mo = write_output(outpath, out, props) else: outpath = outpath or gen_outpath(labels, key) mo = write_output(outpath, out, labels.get_props()) return mo