CouchPotato101/prostate_detection_backend
0
1import numpy as np2import cv23import skimage.io4 5tile_size = 2566image_size = 2567n_tiles = 368 9 10def get_tiles(img, mode=0):11 result = []12 h, w, c = img.shape13 14 pad_h = (tile_size - h % tile_size) % tile_size + ((tile_size * mode) // 2)15 pad_w = (tile_size - w % tile_size) % tile_size + ((tile_size * mode) // 2)16 17 img2 = np.pad(img, [18 [pad_h // 2, pad_h - pad_h // 2],19 [pad_w // 2, pad_w - pad_w // 2],20 [0, 0]21 ], constant_values=255)22 23 img3 = img2.reshape(24 img2.shape[0] // tile_size,25 tile_size,26 img2.shape[1] // tile_size,27 tile_size,28 329 )30 31 img3 = img3.transpose(0, 2, 1, 3, 4).reshape(-1, tile_size, tile_size, 3)32 33 if len(img3) < n_tiles:34 img3 = np.pad(img3, [[0, n_tiles - len(img3)], [0, 0], [0, 0], [0, 0]], constant_values=255)35 36 idxs = np.argsort(img3.reshape(img3.shape[0], -1).sum(-1))[:n_tiles]37 img3 = img3[idxs]38 39 for i in range(len(img3)):40 result.append({'img': img3[i], 'idx': i})41 42 return result43 44 45def load_and_preprocess_image(path: str):46 multi_image = skimage.io.MultiImage(path)47 48 if len(multi_image) >= 2:49 image = multi_image[1]50 else:51 image = multi_image[0]52 53 if image.shape[0] > 2000:54 scale_factor = 1000 / image.shape[0]55 new_width = int(image.shape[1] * scale_factor)56 new_height = int(image.shape[0] * scale_factor)57 image = cv2.resize(image, (new_width, new_height))58 59 return image60 61 62def create_tiled(image):63 tiles = get_tiles(image)64 65 n_row_tiles = int(np.sqrt(n_tiles))66 tiled_image = np.zeros((image_size * n_row_tiles, image_size * n_row_tiles, 3))67 68 for h in range(n_row_tiles):69 for w in range(n_row_tiles):70 i = h * n_row_tiles + w71 this_img = tiles[i]['img']72 73 this_img = 255 - this_img # invert74 h1 = h * image_size75 w1 = w * image_size76 tiled_image[h1:h1 + image_size, w1:w1 + image_size] = this_img77 78 return tiled_image79 