File size: 2,108 Bytes
907462b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import numpy as np
from xml.dom import minidom
from skimage.draw import polygon
from tifffile import imread
import os
from PIL import Image

data_directory = "/home/ubuntu/thesis/data/MoNuSeg/MoNuSeg 2018 Training Data/"
def he_to_binary_mask(filename):
    im_file = data_directory + "Tissue Images/" + filename + '.tif'
    xml_file = data_directory + "Annotations/" + filename + '.xml'

    # Parse the XML file
    xDoc = minidom.parse(xml_file)
    Regions = xDoc.getElementsByTagName('Region')

    xy = []
    for regioni in range(Regions.length):
        Region = Regions.item(regioni)
        verticies = Region.getElementsByTagName('Vertex')
        xy_region = np.zeros((verticies.length, 2))
        for vertexi in range(verticies.length):
            x = float(verticies.item(vertexi).getAttribute('X'))
            y = float(verticies.item(vertexi).getAttribute('Y'))
            xy_region[vertexi] = [x, y]
        xy.append(xy_region)

    arr = imread(im_file)
    # Get image information
    im_info = {
        'Height': arr.shape[0],
        'Width': arr.shape[1]
    }
    binary_mask = np.zeros((im_info['Height'], im_info['Width']))
    color_mask = np.zeros((im_info['Height'], im_info['Width'], 3))

    for zz, region in enumerate(xy):
        print(f'Processing object # {zz + 1}')
        smaller_x = region[:, 0]
        smaller_y = region[:, 1]

        # Create binary and color masks
        polygon_mask = polygon(smaller_y, smaller_x, (im_info['Height'], im_info['Width']))
        binary_mask[polygon_mask] += zz + 1
        color_mask[polygon_mask] += np.random.rand(3)

    return binary_mask, color_mask

image_list = os.listdir(data_directory + "Tissue Images/")
for i in image_list:
    binary_mask, color_mask = he_to_binary_mask(i[:-4])
    values = np.unique(binary_mask)
    masks = np.zeros(binary_mask.shape)
    for k in range(len(values)):
        masks = np.where(binary_mask == values[k], k, masks)
    os.makedirs(data_directory + "Masks_new/", exist_ok=True)
    Image.fromarray(masks.astype(np.int32)).save(data_directory + "Masks_new/" + i[:-4] + ".png")