Spaces:
Build error
Build error
| import math | |
| import cv2 | |
| import numpy as np | |
| from matplotlib import pyplot as plt | |
| from scipy import ndimage | |
| from skimage import measure, color, io | |
| from tensorflow.keras.preprocessing import image | |
| from scipy import ndimage | |
| #Function that predicts on only 1 sample | |
| def predict_sample(image): | |
| prediction = model.predict(image[tf.newaxis, ...]) | |
| prediction[prediction > 0.5 ] = 1 | |
| prediction[prediction !=1] = 0 | |
| result = prediction[0]*255 | |
| return result | |
| def create_input_image(data, visualize=False): | |
| #Initialize input matrix | |
| input = np.ones((256,256)) | |
| #Fill matrix with data point values | |
| for i in range(0,len(data)): | |
| if math.floor(data[i][0]) < 256 and math.floor(data[i][1]) < 256: | |
| input[math.floor(data[i][0])][math.floor(data[i][1])] = 0 | |
| elif math.floor(data[i][0]) >= 256: | |
| input[255][math.floor(data[i][1])] = 0 | |
| elif math.floor(data[i][1]) >= 256: | |
| input[math.floor(data[i][0])][255] = 0 | |
| #Visualize | |
| if visualize == True: | |
| plt.imshow(input.T, cmap='gray') | |
| plt.gca().invert_yaxis() | |
| return input | |
| def get_instances(prediction, data, max_filter_size=1): | |
| #Adjust format (clusters to be 255 and rest is 0) | |
| prediction[prediction == 255] = 3 | |
| prediction[prediction == 0] = 4 | |
| prediction[prediction == 3] = 0 | |
| prediction[prediction == 4] = 255 | |
| #Convert to 8-bit image | |
| prediction = image.img_to_array(prediction, dtype='uint8') | |
| #Get 1 color channel | |
| cells=prediction[:,:,0] | |
| #Threshold | |
| ret1, thresh = cv2.threshold(cells, 0, 255, cv2.THRESH_BINARY) | |
| #Filter to remove noise | |
| kernel = np.ones((3,3),np.uint8) | |
| opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel, iterations = 2) | |
| #Get the background | |
| background = cv2.dilate(opening,kernel,iterations=5) | |
| dist_transform = cv2.distanceTransform(opening,cv2.DIST_L2,5) | |
| ret2, foreground = cv2.threshold(dist_transform,0.04*dist_transform.max(),255,0) | |
| foreground = np.uint8(foreground) | |
| unknown = cv2.subtract(background,foreground) | |
| #Connected Component Analysis | |
| ret3, markers = cv2.connectedComponents(foreground) | |
| markers = markers+10 | |
| markers[unknown==255] = 0 | |
| #Watershed | |
| img = cv2.merge((prediction,prediction,prediction)) | |
| markers = cv2.watershed(img,markers) | |
| img[markers == -1] = [0,255,255] | |
| #Maximum filtering | |
| markers = ndimage.maximum_filter(markers, size=max_filter_size) | |
| # plt.imshow(markers.T, cmap='gray') | |
| # plt.gca().invert_yaxis() | |
| #Get an RGB colored image | |
| img2 = color.label2rgb(markers, bg_label=1) | |
| # plt.imshow(img2) | |
| # plt.gca().invert_yaxis() | |
| #Get regions | |
| regions = measure.regionprops(markers, intensity_image=cells) | |
| #Get Cluster IDs | |
| cluster_ids = np.zeros(len(data)) | |
| for i in range(0,len(cluster_ids)): | |
| row = math.floor(data[i][0]) | |
| column = math.floor(data[i][1]) | |
| if row < 256 and column < 256: | |
| cluster_ids[i] = markers[row][column] - 10 | |
| elif row >= 256: | |
| # cluster_ids[i] = markers[255][column] | |
| cluster_ids[i] = 0 | |
| elif column >= 256: | |
| # cluster_ids[i] = markers[row][255] | |
| cluster_ids[i] = 0 | |
| cluster_ids = cluster_ids.astype('int8') | |
| cluster_ids[cluster_ids == -11] = 0 | |
| return cluster_ids |