DNAI / dnafiber /data /utils.py
ClementP's picture
Upload 55 files
69591a9 verified
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