|
| 1 | +import numpy as np |
| 2 | +from klib.baseio import * |
| 3 | +from scipy.ndimage import filters as ndfilter |
| 4 | +from klib.glib.DrawSimulationSWCModel import simulate3DTreeModel, save_swc |
| 5 | +import copy |
| 6 | +import cv2 as cv |
| 7 | +import multiprocessing as mp |
| 8 | +from skimage import morphology |
| 9 | +import time |
| 10 | + |
| 11 | +# init parameter |
| 12 | +data_type = np.uint8 |
| 13 | +internal_feature = True |
| 14 | +external_feature = True |
| 15 | +image_number = 4 |
| 16 | + |
| 17 | +# size of training data |
| 18 | +size_x = 64 |
| 19 | +size_y = 64 |
| 20 | +channel = 16 |
| 21 | +steps = 8 |
| 22 | + |
| 23 | +# data dir |
| 24 | +data_image_dir = 'data/sim_img/' |
| 25 | +data_label_dir = 'data/sim_label/' |
| 26 | +data_swc_dir = 'data/sim_swc/' |
| 27 | + |
| 28 | +train_data_dir = 'data/data_divide/' |
| 29 | +train_label_dir = 'data/label_divide/' |
| 30 | + |
| 31 | +def main(img_num): |
| 32 | + np.random.seed() |
| 33 | + |
| 34 | + k = 1 |
| 35 | + # size of fake neuron images |
| 36 | + MAX_BOX_Z = 256 |
| 37 | + MAX_BOX_X = 256 * 2 |
| 38 | + MAX_BOX_Y = 256 |
| 39 | + |
| 40 | + MAX_BOX_WIDTH = [MAX_BOX_Z,MAX_BOX_X,MAX_BOX_Y] |
| 41 | + |
| 42 | + |
| 43 | + img_sim, label_sim, swc_data = simulate3DTreeModel(MAX_BOX_WIDTH, internal_feature, external_feature, data_type=data_type) |
| 44 | + SHAPE = img_sim.shape |
| 45 | + |
| 46 | + img_new = np.zeros([int(SHAPE[0] // 2), int(SHAPE[1]), int(SHAPE[2])], dtype=data_type) |
| 47 | + label_new = np.zeros([int(SHAPE[0] // 2), int(SHAPE[1]), int(SHAPE[2])], dtype=np.uint8) |
| 48 | + |
| 49 | + |
| 50 | + # adjust anisotropic resolutions Z: 1->0.5 |
| 51 | + for y in range(SHAPE[2]): |
| 52 | + img_temp = copy.deepcopy(img_sim[:, :, y:y + 1].reshape((SHAPE[0], SHAPE[1]))) |
| 53 | + img_temp_1 = cv.resize(img_temp, (int(SHAPE[1]), int(SHAPE[0])//2)) |
| 54 | + img_temp_2 = copy.deepcopy(img_temp_1.reshape((int(SHAPE[0] // 2), int(SHAPE[1]), 1))) |
| 55 | + img_new[:, :, y:y + 1] = copy.deepcopy(img_temp_2) |
| 56 | + |
| 57 | + label_temp = copy.deepcopy(label_sim[:, :, y:y + 1].reshape((SHAPE[0], SHAPE[1]))) |
| 58 | + label_temp_1 = cv.resize(label_temp, (int(SHAPE[1]), int(SHAPE[0]//2))) |
| 59 | + label_temp_2 = copy.deepcopy(label_temp_1.reshape((int(SHAPE[0] // 2), int(SHAPE[1]), 1))) |
| 60 | + label_new[:, :, y:y + 1] = copy.deepcopy(label_temp_2) |
| 61 | + |
| 62 | + for i in range(swc_data.shape[0]): |
| 63 | + swc_data[i][4] = swc_data[i][4] / 2 |
| 64 | + |
| 65 | + data_image_dir_tmp = data_image_dir + str(img_num + 1) + '.tif' |
| 66 | + data_label_dir_tmp = data_label_dir + str(img_num + 1) + '.gt.tif' |
| 67 | + data_swc_dir_tmp = data_swc_dir + str(img_num + 1) + '.swc' |
| 68 | + |
| 69 | + save_tif(img_new, data_image_dir_tmp, data_type) |
| 70 | + save_tif(label_new, data_label_dir_tmp, np.uint8) |
| 71 | + save_swc(data_swc_dir_tmp, swc_data) |
| 72 | + |
| 73 | + |
| 74 | + # make sure the branch is centered in the image |
| 75 | + c, a, b = img_new.shape |
| 76 | + skel = morphology.skeletonize_3d(label_new) |
| 77 | + skl_random_mask = np.random.randint(0,20,size=(c,a,b)) |
| 78 | + skl_random = skl_random_mask * skel |
| 79 | + skl_random[skl_random!=1]=0 |
| 80 | + skl_seed_pos = np.where(skl_random==1) |
| 81 | + |
| 82 | + for slice_num in range(skl_seed_pos[0].shape[0]): |
| 83 | + z = skl_seed_pos[0][slice_num] |
| 84 | + x = skl_seed_pos[1][slice_num] |
| 85 | + y = skl_seed_pos[2][slice_num] |
| 86 | + |
| 87 | + if z < channel//2 or z > c - channel//2 or x < size_x//2 or x > a - size_x//2 or y < size_y//2 or y > b - size_y//2: |
| 88 | + continue |
| 89 | + else: |
| 90 | + temp_image = img_new[z-channel//2:z + channel//2, x - size_x//2:x + size_x//2, y - size_y//2:y + size_y//2] |
| 91 | + temp_label = label_new[z-channel//2:z + channel//2, x - size_x//2:x + size_x//2, y - size_y//2:y + size_y//2] |
| 92 | + |
| 93 | + newname_fake = train_data_dir + str(img_num + 1) + '_' + str(k) + '.tif' |
| 94 | + newname_label = train_label_dir + str(img_num + 1) + '_' + str(k) + '.tif' |
| 95 | + |
| 96 | + save_tif(temp_image, newname_fake, data_type) |
| 97 | + save_tif(temp_label, newname_label, np.uint8) |
| 98 | + k = k + 1 |
| 99 | + |
| 100 | + print('image ID: %d, number of training images: %d' % (img_num, k)) |
| 101 | + time.sleep(1) |
| 102 | + |
| 103 | + |
| 104 | +if __name__ == '__main__': |
| 105 | + # multiprocessing |
| 106 | + cpu_core_num = 4 |
| 107 | + pool = mp.Pool(processes=cpu_core_num) # we set cpu core is 4 |
| 108 | + pool.map(main, range(0, image_number)) |
| 109 | + |
0 commit comments