File size: 1,525 Bytes
6ffe23f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from scipy.ndimage import label, find_objects
import numpy as np
import cv2


IMAGE_SPACING_X = 0.7031
IMAGE_SPACING_Y = 0.7031
IMAGE_SPACING_Z = 2.5 



def compute_largest_diameter(binary_mask):
    
    # Label connected components in the binary mask
    labeled_array, num_features = label(binary_mask)

    # Find the objects (tumors) in the labeled array
    tumor_objects = find_objects(labeled_array)

    # Initialize the largest diameter variable
    largest_diameter = 0

    # Iterate through each tumor object
    for obj in tumor_objects:
        # Calculate the dimensions of the tumor object
        z_dim = obj[2].stop - obj[2].start
        y_dim = obj[1].stop - obj[1].start
        x_dim = obj[0].stop - obj[0].start

        # Calculate the diameter using the longest dimension
        diameter = max(z_dim * IMAGE_SPACING_Z, y_dim * IMAGE_SPACING_Y, x_dim * IMAGE_SPACING_X)

        # Update the largest diameter if necessary
        if diameter > largest_diameter:
            largest_diameter = diameter

    return largest_diameter / 10 # IN CM




def generate_features(img, liver, tumor):
    
    contours, _ = cv2.findContours(mask_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    
    features = {
        "lesion size (cm)": compute_largest_diameter(tumor),
        "lesion shape": "irregular",
        "lesion density (HU)": np.mean(img[tumor==1]),
        "involvement of adjacent organs:": "Yes" if np.sum(np.multiply(liver==0, tumor)) > 0 else "No"
    }

    
    return features