Source code for histomicstk.segmentation.rag

import numpy as np


[docs] def rag(im_label, neigh_conn=4): """Constructs a region adjacency graph for a label image using either 4-neighbor or 8-neighbor connectivity. Background pixels are not included (im_label == 0). Not intended to build large graphs from individual pixels. Parameters ---------- im_label : array_like im_label image where positive values (im_label > 0) correspond to foreground objects of interest. neigh_conn : float The neighbor connectivity to use, either '4' or '8'. Default value = 4. Returns ------- adj_mat : array_like A binary matrix of size N x N, where N is the number of objects in im_label. A value of 'True' at adj_mat(i,j) indicates that objects 'i' and 'j' are neigh_conn. """ # initialize adjacency matrix for im_label.max() total regions adj_mat = np.zeros((im_label.max(), im_label.max()), dtype=bool) # process 4-neigh_conn horizontal connections Mask = (im_label[:, 1:-1] != im_label[:, 0:-2]) & \ (im_label[:, 1:-1] != 0) & (im_label[:, 0:-2] != 0) Indices = np.nonzero(Mask) Xc = np.concatenate((im_label[Indices[0], Indices[1]][:, np.newaxis], im_label[Indices[0], Indices[1] + 1][:, np.newaxis]), axis=1) # process 4-neigh_conn vertical connections Mask = (im_label[1:-1, :] != im_label[0:-2, :]) & \ (im_label[1:-1, :] != 0) & (im_label[0:-2, :] != 0) Indices = np.nonzero(Mask) Xc = np.concatenate((Xc, np.concatenate((im_label[Indices[0], Indices[1]] [:, np.newaxis], im_label[Indices[0] + 1, Indices[1]] [:, np.newaxis]), axis=1)), axis=0) # process additional 8-neighbor relationships if neigh_conn == 8: # shift upper-right ([1, 1]) Mask = (im_label[1:-1, 0:-2] != im_label[0:-2, 1:-1]) & \ (im_label[1:-1, 0:-2] != 0) & (im_label[0:-2, 1:-1] != 0) Indices = np.nonzero(Mask) Xc = np.concatenate(( Xc, np.concatenate(( im_label[Indices[0] + 1, Indices[1]][:, np.newaxis], im_label[Indices[0], Indices[1] + 1][:, np.newaxis]), axis=1)), axis=0, ) # shift upper-left ([-1, 1]) Mask = (im_label[0:-2, 0:-2] != im_label[1:-1, 1:-1]) & \ (im_label[0:-2, 0:-2] != 0) & (im_label[1:-1, 1:-1] != 0) Indices = np.nonzero(Mask) Xc = np.concatenate(( Xc, np.concatenate(( im_label[Indices[0], Indices[1]][:, np.newaxis], im_label[Indices[0] + 1, Indices[1] + 1][:, np.newaxis]), axis=1)), axis=0, ) # add entries to adjacency matrix for i in range(Xc.shape[0]): adj_mat[Xc[i, 0] - 1, Xc[i, 1] - 1] = True adj_mat[Xc[i, 1] - 1, Xc[i, 0] - 1] = True # return result return adj_mat