- remove center and shape from Transform
This commit is contained in:
1 parent
e1caa1c0b0
commit
f0404d0419
5 files changed
+57
-162
No files matched your search
+1
-1
Submodule image-registration updated: dc1d5d8364...aac61b981f.
@@ -116,24 +116,6 @@ class Transform:
|
|||||||
@dparameters.setter
|
@dparameters.setter
|
||||||
def dparameters(self, value: typing.Sequence[builtins.float]) -> None: ...
|
def dparameters(self, value: typing.Sequence[builtins.float]) -> None: ...
|
||||||
@property
|
@property
|
||||||
def center(self) -> builtins.list[builtins.float]: ...
|
|
||||||
@center.setter
|
|
||||||
def center(self, value: typing.Sequence[builtins.float]) -> None: ...
|
|
||||||
@property
|
|
||||||
def origin(self) -> builtins.list[builtins.float]:
|
|
||||||
r"""
|
|
||||||
backwards compatibility
|
|
||||||
"""
|
|
||||||
@origin.setter
|
|
||||||
def origin(self, value: typing.Sequence[builtins.float]) -> None:
|
|
||||||
r"""
|
|
||||||
backwards compatibility
|
|
||||||
"""
|
|
||||||
@property
|
|
||||||
def shape(self) -> builtins.list[builtins.int]: ...
|
|
||||||
@shape.setter
|
|
||||||
def shape(self, value: typing.Sequence[builtins.int]) -> None: ...
|
|
||||||
@property
|
|
||||||
def ndim(self) -> builtins.int: ...
|
def ndim(self) -> builtins.int: ...
|
||||||
@property
|
@property
|
||||||
def matrix(self) -> numpy.typing.NDArray[numpy.float64]: ...
|
def matrix(self) -> numpy.typing.NDArray[numpy.float64]: ...
|
||||||
@@ -149,18 +131,12 @@ class Transform:
|
|||||||
def __new__(
|
def __new__(
|
||||||
cls,
|
cls,
|
||||||
parameters: typing.Optional[typing.Sequence[builtins.float]] = None,
|
parameters: typing.Optional[typing.Sequence[builtins.float]] = None,
|
||||||
shape: typing.Optional[typing.Sequence[builtins.int]] = None,
|
dparameters: typing.Optional[typing.Sequence[builtins.float]] = None,
|
||||||
center: typing.Optional[typing.Sequence[builtins.float]] = None,
|
center: typing.Optional[typing.Sequence[builtins.float]] = None,
|
||||||
) -> Transform: ...
|
) -> Transform: ...
|
||||||
def __getnewargs__(
|
def __getnewargs__(
|
||||||
self,
|
self,
|
||||||
) -> tuple[
|
) -> tuple[builtins.list[builtins.float], builtins.list[builtins.float]]: ...
|
||||||
builtins.list[builtins.float],
|
|
||||||
builtins.list[builtins.int],
|
|
||||||
typing.Optional[builtins.list[builtins.float]],
|
|
||||||
]: ...
|
|
||||||
def __getstate__(self) -> builtins.list[builtins.float]: ...
|
|
||||||
def __setstate__(self, state: typing.Sequence[builtins.float]) -> None: ...
|
|
||||||
def __add__(self, other: Transform) -> Transform: ...
|
def __add__(self, other: Transform) -> Transform: ...
|
||||||
def __radd__(self, other: Transform) -> Transform: ...
|
def __radd__(self, other: Transform) -> Transform: ...
|
||||||
def __sub__(self, other: Transform) -> Transform: ...
|
def __sub__(self, other: Transform) -> Transform: ...
|
||||||
@@ -168,11 +144,6 @@ class Transform:
|
|||||||
def __mul__(self, other: Transform | float) -> Transform: ...
|
def __mul__(self, other: Transform | float) -> Transform: ...
|
||||||
def __rmul__(self, other: Transform | float) -> Transform: ...
|
def __rmul__(self, other: Transform | float) -> Transform: ...
|
||||||
def __truediv__(self, other: builtins.float) -> Transform: ...
|
def __truediv__(self, other: builtins.float) -> Transform: ...
|
||||||
def adapt(
|
|
||||||
self,
|
|
||||||
center: typing.Sequence[builtins.float],
|
|
||||||
shape: typing.Sequence[builtins.int],
|
|
||||||
) -> None: ...
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def from_scaling(scaling: typing.Sequence[builtins.float]) -> Transform: ...
|
def from_scaling(scaling: typing.Sequence[builtins.float]) -> Transform: ...
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@@ -202,10 +173,10 @@ class Transform:
|
|||||||
"""
|
"""
|
||||||
def is_unity(self) -> builtins.bool: ...
|
def is_unity(self) -> builtins.bool: ...
|
||||||
def transform_point(
|
def transform_point(
|
||||||
self, point: numpy.typing.ArrayLike
|
self, point: numpy.typing.ArrayLike, center: numpy.typing.ArrayLike
|
||||||
) -> numpy.typing.NDArray[numpy.float64]: ...
|
) -> numpy.typing.NDArray[numpy.float64]: ...
|
||||||
def transform_points(
|
def transform_points(
|
||||||
self, points: numpy.typing.ArrayLike
|
self, points: numpy.typing.ArrayLike, center: numpy.typing.ArrayLike
|
||||||
) -> numpy.typing.NDArray[numpy.float64]: ...
|
) -> numpy.typing.NDArray[numpy.float64]: ...
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def register(
|
def register(
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
use crate::error::Error;
|
use crate::error::Error;
|
||||||
use crate::py::imread::PyView;
|
use crate::py::imread::PyView;
|
||||||
use crate::readers::Reader;
|
|
||||||
use crate::transforms::Transforms;
|
use crate::transforms::Transforms;
|
||||||
use image_registration::metric::{SamplingArg, Sigma};
|
use image_registration::metric::{SamplingArg, Sigma};
|
||||||
use image_registration::register::{Optimizer, RegistrationStep};
|
use image_registration::register::{Optimizer, RegistrationStep};
|
||||||
@@ -36,41 +35,31 @@ pub(crate) struct PyTransform {
|
|||||||
#[pymethods]
|
#[pymethods]
|
||||||
impl PyTransform {
|
impl PyTransform {
|
||||||
#[new]
|
#[new]
|
||||||
#[pyo3(signature = (parameters = None, shape = None, center = None))]
|
#[pyo3(signature = (parameters = None, dparameters = None, center = None))]
|
||||||
fn new(
|
fn new(
|
||||||
parameters: Option<Vec<f64>>,
|
parameters: Option<Vec<f64>>,
|
||||||
shape: Option<Vec<usize>>,
|
dparameters: Option<Vec<f64>>,
|
||||||
center: Option<Vec<f64>>,
|
center: Option<Vec<f64>>,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
let parameters = parameters.unwrap_or_else(|| vec![1.0, 0.0, 0.0, 1.0, 0.0, 0.0]);
|
let parameters = parameters.unwrap_or_else(|| vec![1.0, 0.0, 0.0, 1.0, 0.0, 0.0]);
|
||||||
let shape = shape.unwrap_or_else(|| vec![512, 512]);
|
let mut transform = if let Some(center) = center {
|
||||||
if let Some(center) = center {
|
Transform::new_around_center(parameters, ¢er)
|
||||||
Self {
|
|
||||||
inner: Transform::new_with_center(parameters, center, shape),
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
Self {
|
Transform::new(parameters)
|
||||||
inner: Transform::new(parameters, shape),
|
};
|
||||||
}
|
if let Some(dparameters) = dparameters {
|
||||||
|
transform.dparameters = dparameters;
|
||||||
}
|
}
|
||||||
|
Self { inner: transform }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn __getnewargs__(&self) -> (Vec<f64>, Vec<usize>, Option<Vec<f64>>) {
|
fn __getnewargs__(&self) -> (Vec<f64>, Vec<f64>) {
|
||||||
(
|
(
|
||||||
self.inner.parameters.clone(),
|
self.inner.parameters.clone(),
|
||||||
self.inner.shape.clone(),
|
self.inner.dparameters.clone(),
|
||||||
Some(self.inner.center.clone()),
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn __getstate__(&self) -> Vec<f64> {
|
|
||||||
self.inner.dparameters.clone()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn __setstate__(&mut self, state: Vec<f64>) {
|
|
||||||
self.inner.dparameters = state;
|
|
||||||
}
|
|
||||||
|
|
||||||
fn __add__(&self, other: &PyTransform) -> PyTransform {
|
fn __add__(&self, other: &PyTransform) -> PyTransform {
|
||||||
PyTransform {
|
PyTransform {
|
||||||
inner: &self.inner + &other.inner,
|
inner: &self.inner + &other.inner,
|
||||||
@@ -159,38 +148,6 @@ impl PyTransform {
|
|||||||
self.inner.dparameters = dparameters;
|
self.inner.dparameters = dparameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[getter]
|
|
||||||
fn get_center(&self) -> Vec<f64> {
|
|
||||||
self.inner.center.clone()
|
|
||||||
}
|
|
||||||
|
|
||||||
#[setter]
|
|
||||||
fn set_center(&mut self, center: Vec<f64>) {
|
|
||||||
self.inner.center = center;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// backwards compatibility
|
|
||||||
#[getter]
|
|
||||||
fn get_origin(&self) -> Vec<f64> {
|
|
||||||
self.inner.center.clone()
|
|
||||||
}
|
|
||||||
|
|
||||||
/// backwards compatibility
|
|
||||||
#[setter]
|
|
||||||
fn set_origin(&mut self, center: Vec<f64>) {
|
|
||||||
self.inner.center = center;
|
|
||||||
}
|
|
||||||
|
|
||||||
#[getter]
|
|
||||||
fn get_shape(&self) -> Vec<usize> {
|
|
||||||
self.inner.shape.clone()
|
|
||||||
}
|
|
||||||
|
|
||||||
#[setter]
|
|
||||||
fn set_shape(&mut self, shape: Vec<usize>) {
|
|
||||||
self.inner.shape = shape;
|
|
||||||
}
|
|
||||||
|
|
||||||
#[getter]
|
#[getter]
|
||||||
fn get_ndim(&self) -> usize {
|
fn get_ndim(&self) -> usize {
|
||||||
self.inner.ndim()
|
self.inner.ndim()
|
||||||
@@ -233,10 +190,6 @@ impl PyTransform {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn adapt(&mut self, center: Vec<f64>, shape: Vec<usize>) {
|
|
||||||
self.inner.adapt(center.as_slice(), shape.as_slice());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[staticmethod]
|
#[staticmethod]
|
||||||
fn from_scaling(scaling: Vec<f64>) -> PyTransform {
|
fn from_scaling(scaling: Vec<f64>) -> PyTransform {
|
||||||
PyTransform {
|
PyTransform {
|
||||||
@@ -436,13 +389,19 @@ impl PyTransform {
|
|||||||
py: Python<'py>,
|
py: Python<'py>,
|
||||||
#[gen_stub(override_type(type_repr="numpy.typing.ArrayLike", imports=("numpy.typing")))]
|
#[gen_stub(override_type(type_repr="numpy.typing.ArrayLike", imports=("numpy.typing")))]
|
||||||
point: PyArrayLike1<f64, AllowTypeChange>,
|
point: PyArrayLike1<f64, AllowTypeChange>,
|
||||||
|
#[gen_stub(override_type(type_repr="numpy.typing.ArrayLike", imports=("numpy.typing")))]
|
||||||
|
center: PyArrayLike1<f64, AllowTypeChange>,
|
||||||
) -> Bound<'py, PyArray1<f64>> {
|
) -> Bound<'py, PyArray1<f64>> {
|
||||||
let point = point.as_array();
|
let point = point.as_array();
|
||||||
if let Some(slice) = point.as_slice() {
|
let center = center.as_array();
|
||||||
self.inner.transform_point(slice)
|
|
||||||
} else {
|
match (point.as_slice(), center.as_slice()) {
|
||||||
let point = point.to_vec();
|
(Some(point), Some(center)) => self.inner.transform_point(point, center),
|
||||||
self.inner.transform_point(&point)
|
(Some(point), None) => self.inner.transform_point(point, ¢er.to_vec()),
|
||||||
|
(None, Some(center)) => self.inner.transform_point(&point.to_vec(), center),
|
||||||
|
(None, None) => self
|
||||||
|
.inner
|
||||||
|
.transform_point(&point.to_vec(), ¢er.to_vec()),
|
||||||
}
|
}
|
||||||
.into_pyarray(py)
|
.into_pyarray(py)
|
||||||
}
|
}
|
||||||
@@ -452,10 +411,19 @@ impl PyTransform {
|
|||||||
py: Python<'py>,
|
py: Python<'py>,
|
||||||
#[gen_stub(override_type(type_repr="numpy.typing.ArrayLike", imports=("numpy.typing")))]
|
#[gen_stub(override_type(type_repr="numpy.typing.ArrayLike", imports=("numpy.typing")))]
|
||||||
points: PyArrayLike2<f64, AllowTypeChange>,
|
points: PyArrayLike2<f64, AllowTypeChange>,
|
||||||
|
#[gen_stub(override_type(type_repr="numpy.typing.ArrayLike", imports=("numpy.typing")))]
|
||||||
|
center: PyArrayLike1<f64, AllowTypeChange>,
|
||||||
) -> PyResult<Bound<'py, PyArray2<f64>>> {
|
) -> PyResult<Bound<'py, PyArray2<f64>>> {
|
||||||
let points = points.as_array();
|
let points = points.as_array();
|
||||||
|
let center = center.as_array();
|
||||||
Ok(py
|
Ok(py
|
||||||
.detach(|| self.inner.transform_points(points))
|
.detach(|| {
|
||||||
|
if let Some(center) = center.as_slice() {
|
||||||
|
self.inner.transform_points(points, center)
|
||||||
|
} else {
|
||||||
|
self.inner.transform_points(points, ¢er.to_vec())
|
||||||
|
}
|
||||||
|
})
|
||||||
.map_err(Error::from)?
|
.map_err(Error::from)?
|
||||||
.into_pyarray(py))
|
.into_pyarray(py))
|
||||||
}
|
}
|
||||||
@@ -796,17 +764,6 @@ impl PyView {
|
|||||||
main_channel,
|
main_channel,
|
||||||
default_transform,
|
default_transform,
|
||||||
)?;
|
)?;
|
||||||
let new_shape = vec![self.view.raw_shape().y, self.view.raw_shape().x];
|
|
||||||
for transform in new.view.transforms.channel.values_mut() {
|
|
||||||
for (c, (old_s, new_s)) in transform
|
|
||||||
.center
|
|
||||||
.iter_mut()
|
|
||||||
.zip(transform.shape.iter().zip(new_shape.iter()))
|
|
||||||
{
|
|
||||||
*c -= (*old_s as f64) / 2.0 - (*new_s as f64) / 2.0;
|
|
||||||
}
|
|
||||||
transform.shape = new_shape.clone();
|
|
||||||
}
|
|
||||||
Ok(new)
|
Ok(new)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -33,13 +33,15 @@ impl TryFrom<HashMap<String, TransformOld>> for Transforms {
|
|||||||
channel: t
|
channel: t
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|(n, i)| {
|
.map(|(n, i)| {
|
||||||
|
let center = i
|
||||||
|
.size
|
||||||
|
.iter()
|
||||||
|
.zip(i.center_of_rotation_point.iter())
|
||||||
|
.map(|(s, c)| c - s / 2.0 + 0.5)
|
||||||
|
.collect::<Vec<_>>();
|
||||||
Ok((
|
Ok((
|
||||||
n,
|
n,
|
||||||
Transform::new_with_center(
|
Transform::new_around_center(i.transform_parameters, ¢er)
|
||||||
i.transform_parameters,
|
|
||||||
i.center_of_rotation_point,
|
|
||||||
i.size.into_iter().map(|j| j as usize).collect(),
|
|
||||||
)
|
|
||||||
.with_dparameters(i.dtransform_parameters)
|
.with_dparameters(i.dtransform_parameters)
|
||||||
.inverse()?,
|
.inverse()?,
|
||||||
))
|
))
|
||||||
@@ -93,6 +95,7 @@ impl Serialize for Transforms {
|
|||||||
|
|
||||||
#[derive(Serialize)]
|
#[derive(Serialize)]
|
||||||
struct Binary<'a> {
|
struct Binary<'a> {
|
||||||
|
interpolation_order: Option<usize>,
|
||||||
channel: &'a HashMap<String, Transform<IxDyn>>,
|
channel: &'a HashMap<String, Transform<IxDyn>>,
|
||||||
drift: &'a Vec<Transform<IxDyn>>,
|
drift: &'a Vec<Transform<IxDyn>>,
|
||||||
}
|
}
|
||||||
@@ -105,6 +108,7 @@ impl Serialize for Transforms {
|
|||||||
.serialize(serializer)
|
.serialize(serializer)
|
||||||
} else {
|
} else {
|
||||||
Binary {
|
Binary {
|
||||||
|
interpolation_order: self.interpolation_order,
|
||||||
channel: &self.channel,
|
channel: &self.channel,
|
||||||
drift: &self.drift,
|
drift: &self.drift,
|
||||||
}
|
}
|
||||||
@@ -164,8 +168,7 @@ impl Transforms {
|
|||||||
if let Some(transform_file) = transform_file {
|
if let Some(transform_file) = transform_file {
|
||||||
Self::load(transform_file)
|
Self::load(transform_file)
|
||||||
} else {
|
} else {
|
||||||
let default_transform = default_transform
|
let default_transform = default_transform.map(Transform::new);
|
||||||
.map(|default_transform| Transform::new(default_transform, vec![512, 0]));
|
|
||||||
let mut transforms = Self::default();
|
let mut transforms = Self::default();
|
||||||
if let Some(channels_files) = channels_files {
|
if let Some(channels_files) = channels_files {
|
||||||
let main_channel = main_channel.unwrap_or(0);
|
let main_channel = main_channel.unwrap_or(0);
|
||||||
@@ -303,8 +306,8 @@ impl Transforms {
|
|||||||
match (self.channel.get(channel), self.drift.get(t)) {
|
match (self.channel.get(channel), self.drift.get(t)) {
|
||||||
(Some(channel), Some(drift)) => match (channel.ndim(), drift.ndim()) {
|
(Some(channel), Some(drift)) => match (channel.ndim(), drift.ndim()) {
|
||||||
(2, 2) | (3, 3) => Ok(Some(Cow::Owned(drift * channel))),
|
(2, 2) | (3, 3) => Ok(Some(Cow::Owned(drift * channel))),
|
||||||
(2, 3) => Ok(Some(Cow::Owned(drift.add_dimension(0, 1) * channel))),
|
(2, 3) => Ok(Some(Cow::Owned(drift.add_dimension(0) * channel))),
|
||||||
(3, 2) => Ok(Some(Cow::Owned(drift * channel.add_dimension(0, 1)))),
|
(3, 2) => Ok(Some(Cow::Owned(drift * channel.add_dimension(0)))),
|
||||||
(2 | 3, n) | (n, _) => Err(Error::TransformationNotImplemented(n)),
|
(2 | 3, n) | (n, _) => Err(Error::TransformationNotImplemented(n)),
|
||||||
},
|
},
|
||||||
(Some(channel), None) => Ok(Some(Cow::Borrowed(channel))),
|
(Some(channel), None) => Ok(Some(Cow::Borrowed(channel))),
|
||||||
@@ -348,23 +351,13 @@ impl<D: Dimension, R: Reader> View<D, R> {
|
|||||||
.max_proj(Axis::Z)?
|
.max_proj(Axis::Z)?
|
||||||
.as_array::<f64>()?;
|
.as_array::<f64>()?;
|
||||||
let mut transforms = HashMap::new();
|
let mut transforms = HashMap::new();
|
||||||
let shape = vec![self.shape().y, self.shape().x];
|
|
||||||
let center = shape
|
|
||||||
.iter()
|
|
||||||
.map(|&i| (i as f64 - 1.0) / 2.0)
|
|
||||||
.collect::<Vec<_>>();
|
|
||||||
for (channel, metadata) in self.metadata()?.image[0].pixels.channel.iter().enumerate() {
|
for (channel, metadata) in self.metadata()?.image[0].pixels.channel.iter().enumerate() {
|
||||||
let name = metadata
|
let name = metadata
|
||||||
.name
|
.name
|
||||||
.clone()
|
.clone()
|
||||||
.unwrap_or_else(|| format!("channel{}", channel));
|
.unwrap_or_else(|| format!("channel{}", channel));
|
||||||
if channel == main_channel {
|
if channel == main_channel {
|
||||||
transforms.insert(
|
transforms.insert(name, Transform::default());
|
||||||
name,
|
|
||||||
Transform::default()
|
|
||||||
.with_shape(shape.clone())
|
|
||||||
.with_center(center.clone()),
|
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
let max = self
|
let max = self
|
||||||
.slice_cztyx(s![channel, .., 0, .., ..])?
|
.slice_cztyx(s![channel, .., 0, .., ..])?
|
||||||
@@ -387,23 +380,13 @@ impl<D: Dimension, R: Reader> View<D, R> {
|
|||||||
.slice_cztyx(s![main_channel, .., 0, .., ..])?
|
.slice_cztyx(s![main_channel, .., 0, .., ..])?
|
||||||
.as_array::<f64>()?;
|
.as_array::<f64>()?;
|
||||||
let mut transforms = HashMap::new();
|
let mut transforms = HashMap::new();
|
||||||
let shape = vec![self.shape().z, self.shape().y, self.shape().x];
|
|
||||||
let center = shape
|
|
||||||
.iter()
|
|
||||||
.map(|&i| (i as f64 - 1.0) / 2.0)
|
|
||||||
.collect::<Vec<_>>();
|
|
||||||
for (channel, metadata) in self.metadata()?.image[0].pixels.channel.iter().enumerate() {
|
for (channel, metadata) in self.metadata()?.image[0].pixels.channel.iter().enumerate() {
|
||||||
let name = metadata
|
let name = metadata
|
||||||
.name
|
.name
|
||||||
.clone()
|
.clone()
|
||||||
.unwrap_or_else(|| format!("channel{}", channel));
|
.unwrap_or_else(|| format!("channel{}", channel));
|
||||||
if channel == main_channel {
|
if channel == main_channel {
|
||||||
transforms.insert(
|
transforms.insert(name, Transform::default());
|
||||||
name,
|
|
||||||
Transform::default()
|
|
||||||
.with_shape(shape.clone())
|
|
||||||
.with_center(center.clone()),
|
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
let max = self
|
let max = self
|
||||||
.slice_cztyx(s![channel, .., 0, .., ..])?
|
.slice_cztyx(s![channel, .., 0, .., ..])?
|
||||||
@@ -479,11 +462,12 @@ impl<D: Dimension, R: Reader> View<D, R> {
|
|||||||
3 => {
|
3 => {
|
||||||
let tr = transform.clone().into_dimensionality::<Ix3>()?;
|
let tr = transform.clone().into_dimensionality::<Ix3>()?;
|
||||||
let shape = self.shape();
|
let shape = self.shape();
|
||||||
|
let center = shape.iter().map(|&i| (i as f64) / 2.0).collect::<Vec<_>>();
|
||||||
let zf = z as f64;
|
let zf = z as f64;
|
||||||
let yf = shape.y as f64 - 1.0;
|
let yf = shape.y as f64 - 1.0;
|
||||||
let xf = shape.x as f64 - 1.0;
|
let xf = shape.x as f64 - 1.0;
|
||||||
let corners = array![[zf, 0.0, 0.0], [zf, 0.0, xf], [zf, yf, 0.0], [zf, yf, xf]];
|
let corners = array![[zf, 0.0, 0.0], [zf, 0.0, xf], [zf, yf, 0.0], [zf, yf, xf]];
|
||||||
let extent = tr.transform_points(&corners)?;
|
let extent = tr.transform_points(&corners, ¢er)?;
|
||||||
let z_extent = extent.slice(s![.., 2]);
|
let z_extent = extent.slice(s![.., 2]);
|
||||||
let z_min = (z_extent
|
let z_min = (z_extent
|
||||||
.iter()
|
.iter()
|
||||||
@@ -652,26 +636,18 @@ mod tests {
|
|||||||
let mut channel = HashMap::new();
|
let mut channel = HashMap::new();
|
||||||
channel.insert(
|
channel.insert(
|
||||||
"TV1".to_string(),
|
"TV1".to_string(),
|
||||||
Transform::new_with_center(
|
Transform::new(vec![1.0, 0.0, 0.0, 1.0, 0.0, 0.0]),
|
||||||
vec![1.0, 0.0, 0.0, 1.0, 0.0, 0.0],
|
|
||||||
vec![255.5, 255.5],
|
|
||||||
vec![512, 512],
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
channel.insert(
|
channel.insert(
|
||||||
"TV2".to_string(),
|
"TV2".to_string(),
|
||||||
Transform::new_with_center(
|
Transform::new(vec![
|
||||||
vec![
|
|
||||||
0.9995868322142533,
|
0.9995868322142533,
|
||||||
0.012140955373934502,
|
0.012140955373934502,
|
||||||
0.012592501668218145,
|
0.012592501668218145,
|
||||||
0.8571690967587099,
|
0.8571690967587099,
|
||||||
-5.270859902118885,
|
-5.270859902118885,
|
||||||
-5.81118547158953,
|
-5.81118547158953,
|
||||||
],
|
]),
|
||||||
vec![255.5, 255.5],
|
|
||||||
vec![512, 512],
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
let view_t = view.with_transforms(Transforms {
|
let view_t = view.with_transforms(Transforms {
|
||||||
interpolation_order: None,
|
interpolation_order: None,
|
||||||
|
|||||||
+1
-10
@@ -1167,22 +1167,13 @@ impl<D: Dimension, R: Reader> View<D, R> {
|
|||||||
for (ti, t) in slice_out[2].into_iter().zip(&slice[2]) {
|
for (ti, t) in slice_out[2].into_iter().zip(&slice[2]) {
|
||||||
if let Some(transform) = self.transforms.get_transform(channel_name, t as usize)? {
|
if let Some(transform) = self.transforms.get_transform(channel_name, t as usize)? {
|
||||||
let mut transform = transform.into_owned();
|
let mut transform = transform.into_owned();
|
||||||
if !defer_slice_xy {
|
if !defer_slice_xy && transpose {
|
||||||
if transform.ndim() == 2 {
|
if transform.ndim() == 2 {
|
||||||
transform.center[0] -= slice[3].start as f64;
|
|
||||||
transform.center[1] -= slice[4].start as f64;
|
|
||||||
if transpose {
|
|
||||||
transform = transform.swap_axes(0, 1)
|
transform = transform.swap_axes(0, 1)
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
transform.center[0] -= slice[1].start as f64;
|
|
||||||
transform.center[1] -= slice[3].start as f64;
|
|
||||||
transform.center[2] -= slice[4].start as f64;
|
|
||||||
if transpose {
|
|
||||||
transform = transform.swap_axes(1, 2);
|
transform = transform.swap_axes(1, 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
for (zi, z) in slice_out[1].into_iter().zip(&slice[1]) {
|
for (zi, z) in slice_out[1].into_iter().zip(&slice[1]) {
|
||||||
if !transform_done.contains(&(c, z, t)) {
|
if !transform_done.contains(&(c, z, t)) {
|
||||||
|
|||||||
Reference in new issue
Block a user