Add files via upload
This commit is contained in:
parent
f7316bf003
commit
75dac3f99c
1 changed files with 175 additions and 0 deletions
175
reproduction_effort/functions/align_cameras.py
Normal file
175
reproduction_effort/functions/align_cameras.py
Normal file
|
@ -0,0 +1,175 @@
|
||||||
|
import torch
|
||||||
|
import torchvision as tv # type: ignore
|
||||||
|
import numpy as np
|
||||||
|
import json
|
||||||
|
import scipy.io as sio # type: ignore
|
||||||
|
|
||||||
|
from functions.align_refref import align_refref
|
||||||
|
from functions.perform_donor_volume_rotation import perform_donor_volume_rotation
|
||||||
|
from functions.perform_donor_volume_translation import perform_donor_volume_translation
|
||||||
|
from functions.ImageAlignment import ImageAlignment
|
||||||
|
|
||||||
|
|
||||||
|
@torch.no_grad()
|
||||||
|
def align_cameras(
|
||||||
|
filename_raw_json: str,
|
||||||
|
filename_bin_mat: str,
|
||||||
|
device: torch.device,
|
||||||
|
dtype: torch.dtype,
|
||||||
|
batch_size: int,
|
||||||
|
fill_value: float = 0,
|
||||||
|
) -> tuple[
|
||||||
|
torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor
|
||||||
|
]:
|
||||||
|
image_alignment = ImageAlignment(default_dtype=dtype, device=device)
|
||||||
|
|
||||||
|
# --- Load data ---
|
||||||
|
with open(filename_raw_json, "r") as file_handle:
|
||||||
|
metadata: dict = json.load(file_handle)
|
||||||
|
channels: list[str] = metadata["channelKey"]
|
||||||
|
|
||||||
|
data = torch.tensor(
|
||||||
|
sio.loadmat(filename_bin_mat)["nparray"].astype(np.float32),
|
||||||
|
device=device,
|
||||||
|
dtype=dtype,
|
||||||
|
)
|
||||||
|
# --==-- DONE --==--
|
||||||
|
|
||||||
|
# --- Get reference image ---
|
||||||
|
acceptor_index: int = channels.index("acceptor")
|
||||||
|
donor_index: int = channels.index("donor")
|
||||||
|
oxygenation_index: int = channels.index("oxygenation")
|
||||||
|
volume_index: int = channels.index("volume")
|
||||||
|
|
||||||
|
# --==-- DONE --==--
|
||||||
|
|
||||||
|
# --- Sort data ---
|
||||||
|
acceptor = data[..., acceptor_index].moveaxis(-1, 0).clone()
|
||||||
|
donor = data[..., donor_index].moveaxis(-1, 0).clone()
|
||||||
|
oxygenation = data[..., oxygenation_index].moveaxis(-1, 0).clone()
|
||||||
|
volume = data[..., volume_index].moveaxis(-1, 0).clone()
|
||||||
|
del data
|
||||||
|
# --==-- DONE --==--
|
||||||
|
|
||||||
|
# --- Calculate translation and rotation between the reference images ---
|
||||||
|
angle_refref, tvec_refref, ref_image_acceptor, ref_image_donor = align_refref(
|
||||||
|
ref_image_acceptor=acceptor[
|
||||||
|
acceptor.shape[2] // 2,
|
||||||
|
:,
|
||||||
|
:,
|
||||||
|
],
|
||||||
|
ref_image_donor=donor[
|
||||||
|
donor.shape[2] // 2,
|
||||||
|
:,
|
||||||
|
:,
|
||||||
|
],
|
||||||
|
image_alignment=image_alignment,
|
||||||
|
batch_size=batch_size,
|
||||||
|
fill_value=fill_value,
|
||||||
|
)
|
||||||
|
|
||||||
|
ref_image_oxygenation = tv.transforms.functional.affine(
|
||||||
|
img=oxygenation[
|
||||||
|
oxygenation.shape[2] // 2,
|
||||||
|
:,
|
||||||
|
:,
|
||||||
|
].unsqueeze(0),
|
||||||
|
angle=-float(angle_refref),
|
||||||
|
translate=[0, 0],
|
||||||
|
scale=1.0,
|
||||||
|
shear=0,
|
||||||
|
interpolation=tv.transforms.InterpolationMode.BILINEAR,
|
||||||
|
fill=fill_value,
|
||||||
|
)
|
||||||
|
|
||||||
|
ref_image_oxygenation = tv.transforms.functional.affine(
|
||||||
|
img=ref_image_oxygenation,
|
||||||
|
angle=0,
|
||||||
|
translate=[tvec_refref[1], tvec_refref[0]],
|
||||||
|
scale=1.0,
|
||||||
|
shear=0,
|
||||||
|
interpolation=tv.transforms.InterpolationMode.BILINEAR,
|
||||||
|
fill=fill_value,
|
||||||
|
)
|
||||||
|
|
||||||
|
ref_image_oxygenation = ref_image_oxygenation.squeeze(0)
|
||||||
|
|
||||||
|
ref_image_volume = volume[
|
||||||
|
volume.shape[2] // 2,
|
||||||
|
:,
|
||||||
|
:,
|
||||||
|
].clone()
|
||||||
|
|
||||||
|
# --==-- DONE --==--
|
||||||
|
|
||||||
|
# --- Rotate and translate the acceptor and oxygenation data accordingly ---
|
||||||
|
acceptor = tv.transforms.functional.affine(
|
||||||
|
img=acceptor,
|
||||||
|
angle=-float(angle_refref),
|
||||||
|
translate=[0, 0],
|
||||||
|
scale=1.0,
|
||||||
|
shear=0,
|
||||||
|
interpolation=tv.transforms.InterpolationMode.BILINEAR,
|
||||||
|
fill=fill_value,
|
||||||
|
)
|
||||||
|
|
||||||
|
acceptor = tv.transforms.functional.affine(
|
||||||
|
img=acceptor,
|
||||||
|
angle=0,
|
||||||
|
translate=[tvec_refref[1], tvec_refref[0]],
|
||||||
|
scale=1.0,
|
||||||
|
shear=0,
|
||||||
|
interpolation=tv.transforms.InterpolationMode.BILINEAR,
|
||||||
|
fill=fill_value,
|
||||||
|
)
|
||||||
|
|
||||||
|
oxygenation = tv.transforms.functional.affine(
|
||||||
|
img=oxygenation,
|
||||||
|
angle=-float(angle_refref),
|
||||||
|
translate=[0, 0],
|
||||||
|
scale=1.0,
|
||||||
|
shear=0,
|
||||||
|
interpolation=tv.transforms.InterpolationMode.BILINEAR,
|
||||||
|
fill=fill_value,
|
||||||
|
)
|
||||||
|
|
||||||
|
oxygenation = tv.transforms.functional.affine(
|
||||||
|
img=oxygenation,
|
||||||
|
angle=0,
|
||||||
|
translate=[tvec_refref[1], tvec_refref[0]],
|
||||||
|
scale=1.0,
|
||||||
|
shear=0,
|
||||||
|
interpolation=tv.transforms.InterpolationMode.BILINEAR,
|
||||||
|
fill=fill_value,
|
||||||
|
)
|
||||||
|
# --==-- DONE --==--
|
||||||
|
|
||||||
|
acceptor, donor, oxygenation, volume, angle_donor_volume = (
|
||||||
|
perform_donor_volume_rotation(
|
||||||
|
acceptor=acceptor,
|
||||||
|
donor=donor,
|
||||||
|
oxygenation=oxygenation,
|
||||||
|
volume=volume,
|
||||||
|
ref_image_donor=ref_image_donor,
|
||||||
|
ref_image_volume=ref_image_volume,
|
||||||
|
image_alignment=image_alignment,
|
||||||
|
batch_size=batch_size,
|
||||||
|
fill_value=fill_value,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
acceptor, donor, oxygenation, volume, tvec_donor_volume = (
|
||||||
|
perform_donor_volume_translation(
|
||||||
|
acceptor=acceptor,
|
||||||
|
donor=donor,
|
||||||
|
oxygenation=oxygenation,
|
||||||
|
volume=volume,
|
||||||
|
ref_image_donor=ref_image_donor,
|
||||||
|
ref_image_volume=ref_image_volume,
|
||||||
|
image_alignment=image_alignment,
|
||||||
|
batch_size=batch_size,
|
||||||
|
fill_value=fill_value,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
return acceptor, donor, oxygenation, volume, angle_donor_volume, tvec_donor_volume
|
Loading…
Reference in a new issue