File size: 2,347 Bytes
69591a9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import base64

from xml.dom import minidom
import cv2
import numpy as np
from czifile import CziFile
from tifffile import imread


def read_svg(svg_path):
    doc = minidom.parse(str(svg_path))
    img_strings = {
        path.getAttribute("id"): path.getAttribute("href")
        for path in doc.getElementsByTagName("image")
    }
    doc.unlink()

    red = img_strings["Red"]
    green = img_strings["Green"]
    red = base64.b64decode(red.split(",")[1])
    green = base64.b64decode(green.split(",")[1])
    red = cv2.imdecode(np.frombuffer(red, dtype=np.uint8), cv2.IMREAD_UNCHANGED)
    green = cv2.imdecode(np.frombuffer(green, dtype=np.uint8), cv2.IMREAD_UNCHANGED)

    red = cv2.cvtColor(red, cv2.COLOR_BGRA2GRAY)
    green = cv2.cvtColor(green, cv2.COLOR_BGRA2GRAY)
    mask = np.zeros_like(red)
    mask[red > 0] = 1
    mask[green > 0] = 2
    return mask


def extract_bboxes(mask):
    mask = np.array(mask)
    mask = mask.astype(np.uint8)

    # Find connected components
    num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(
        mask, connectivity=8
    )
    bboxes = []
    for i in range(1, num_labels):
        x, y, w, h, area = stats[i]
        bboxes.append([x, y, x + w, y + h])
    return bboxes


def preprocess(raw_data, reverse_channels=False):
    MAX_VALUE = 2**16 - 1
    if raw_data.ndim == 2:
        raw_data = raw_data[np.newaxis, :, :]
    h, w = raw_data.shape[1:3]
    orders = np.arange(raw_data.shape[0])[::-1]  # Reverse channel order
    result = np.zeros((h, w, 3), dtype=np.uint8)

    for i, chan in enumerate(raw_data):
        hist, bins = np.histogram(chan.ravel(), MAX_VALUE + 1, (0, MAX_VALUE + 1))
        cdf = hist.cumsum()
        cdf_normalized = cdf / cdf[-1]
        bmax = np.searchsorted(cdf_normalized, 0.99, side="left")
        clip = np.clip(chan, 0, bmax).astype(np.float32)
        clip =  (clip - clip.min()) / (bmax - clip.min()) * 255
        result[:, :, orders[i]] = clip
    if reverse_channels:
    # Reverse channels 0 and 1
        result = result[:, :, [1, 0, 2]]
    return result


def read_czi(filepath):
    data = CziFile(filepath)
   
    return data.asarray().squeeze()


def read_tiff(filepath):
    
    data = imread(filepath).squeeze()

    return data