- Slicing bugfix.
- Sort imports. - Make sitk-elastix optional again.
This commit is contained in:
@@ -77,4 +77,3 @@ for example: any file handles
|
|||||||
|
|
||||||
# TODO
|
# TODO
|
||||||
- more image formats
|
- more image formats
|
||||||
- re-implement transforms
|
|
||||||
|
|||||||
@@ -277,7 +277,8 @@ class Imread(np.lib.mixins.NDArrayOperatorsMixin, ABC):
|
|||||||
new_slice.append(s[e])
|
new_slice.append(s[e])
|
||||||
|
|
||||||
# TODO: check output dimensionality when requested shape in some dimension is 1
|
# TODO: check output dimensionality when requested shape in some dimension is 1
|
||||||
if all([isinstance(s, Number) or s.size == 1 for s in new_slice]):
|
if (all([isinstance(s, Number) for s in new_slice[:len(self.axes)]])
|
||||||
|
and all([isinstance(s, Number) or s.size == 1 for s in new_slice[len(self.axes):]])):
|
||||||
return self.block(*new_slice).item()
|
return self.block(*new_slice).item()
|
||||||
else:
|
else:
|
||||||
new = View(self)
|
new = View(self)
|
||||||
|
|||||||
@@ -36,9 +36,9 @@ try:
|
|||||||
try:
|
try:
|
||||||
import jpype.imports
|
import jpype.imports
|
||||||
from loci.common import DebugTools # noqa
|
from loci.common import DebugTools # noqa
|
||||||
from loci.formats import ImageReader # noqa
|
|
||||||
from loci.formats import ChannelSeparator # noqa
|
from loci.formats import ChannelSeparator # noqa
|
||||||
from loci.formats import FormatTools # noqa
|
from loci.formats import FormatTools # noqa
|
||||||
|
from loci.formats import ImageReader # noqa
|
||||||
from loci.formats import MetadataTools # noqa
|
from loci.formats import MetadataTools # noqa
|
||||||
|
|
||||||
DebugTools.setRootLevel("ERROR")
|
DebugTools.setRootLevel("ERROR")
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
__all__ = [file.stem for file in Path(__file__).parent.iterdir()
|
__all__ = [file.stem for file in Path(__file__).parent.iterdir()
|
||||||
if file.suffix == ".py" and not file == Path(__file__) and not file.stem.startswith('.')]
|
if file.suffix == ".py" and not file == Path(__file__) and not file.stem.startswith('.')]
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
import multiprocessing
|
import multiprocessing
|
||||||
import numpy as np
|
|
||||||
from abc import ABC
|
from abc import ABC
|
||||||
from multiprocessing import queues
|
from multiprocessing import queues
|
||||||
from traceback import print_exc
|
from traceback import print_exc
|
||||||
from .. import AbstractReader, JVM
|
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
from .. import JVM, AbstractReader
|
||||||
|
|
||||||
jars = {'bioformats_package.jar':
|
jars = {'bioformats_package.jar':
|
||||||
'https://downloads.openmicroscopy.org/bio-formats/latest/artifacts/bioformats_package.jar'}
|
'https://downloads.openmicroscopy.org/bio-formats/latest/artifacts/bioformats_package.jar'}
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
import czifile
|
|
||||||
import numpy as np
|
|
||||||
import re
|
import re
|
||||||
from lxml import etree
|
|
||||||
from ome_types import model
|
|
||||||
from abc import ABC
|
from abc import ABC
|
||||||
from functools import cached_property
|
from functools import cached_property
|
||||||
from itertools import product
|
from itertools import product
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
import czifile
|
||||||
|
import numpy as np
|
||||||
|
from lxml import etree
|
||||||
|
from ome_types import model
|
||||||
|
|
||||||
from .. import AbstractReader
|
from .. import AbstractReader
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
from abc import ABC
|
from abc import ABC
|
||||||
from tifffile import TiffFile
|
|
||||||
from functools import cached_property
|
from functools import cached_property
|
||||||
from itertools import product
|
from itertools import product
|
||||||
from ome_types import model
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from struct import unpack
|
from struct import unpack
|
||||||
from warnings import warn
|
from warnings import warn
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
from ome_types import model
|
||||||
|
from tifffile import TiffFile
|
||||||
|
|
||||||
from .. import AbstractReader
|
from .. import AbstractReader
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
|
from abc import ABC
|
||||||
|
from functools import cached_property
|
||||||
|
from itertools import product
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from ome_types import model
|
from ome_types import model
|
||||||
from functools import cached_property
|
|
||||||
from abc import ABC
|
|
||||||
from .. import AbstractReader
|
from .. import AbstractReader
|
||||||
from itertools import product
|
|
||||||
|
|
||||||
|
|
||||||
class Reader(AbstractReader, ABC):
|
class Reader(AbstractReader, ABC):
|
||||||
|
|||||||
@@ -1,13 +1,15 @@
|
|||||||
|
import re
|
||||||
|
from abc import ABC
|
||||||
|
from datetime import datetime
|
||||||
|
from functools import cached_property
|
||||||
|
from itertools import product
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
import tifffile
|
import tifffile
|
||||||
import yaml
|
import yaml
|
||||||
import re
|
|
||||||
from pathlib import Path
|
|
||||||
from functools import cached_property
|
|
||||||
from ome_types import model
|
from ome_types import model
|
||||||
from ome_types.units import _quantity_property # noqa
|
from ome_types.units import _quantity_property # noqa
|
||||||
from itertools import product
|
|
||||||
from datetime import datetime
|
|
||||||
from abc import ABC
|
|
||||||
from .. import AbstractReader
|
from .. import AbstractReader
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
|
from abc import ABC
|
||||||
|
from functools import cached_property
|
||||||
|
from itertools import product
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import tifffile
|
import tifffile
|
||||||
import yaml
|
import yaml
|
||||||
from abc import ABC
|
|
||||||
from functools import cached_property
|
|
||||||
from ome_types import model
|
from ome_types import model
|
||||||
from pathlib import Path
|
|
||||||
from itertools import product
|
|
||||||
from .. import AbstractReader
|
from .. import AbstractReader
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ from pathlib import Path
|
|||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import yaml
|
import yaml
|
||||||
from parfor import pmap, Chunks
|
from parfor import Chunks, pmap
|
||||||
from skimage import filters
|
from skimage import filters
|
||||||
from tiffwrite import IJTiffFile
|
from tiffwrite import IJTiffFile
|
||||||
from tqdm.auto import tqdm
|
from tqdm.auto import tqdm
|
||||||
@@ -255,8 +255,8 @@ class Transforms(dict):
|
|||||||
class Transform:
|
class Transform:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
if sitk is None:
|
if sitk is None:
|
||||||
raise ImportError('SimpleElastix is not installed: '
|
self.transform = None
|
||||||
'https://simpleelastix.readthedocs.io/GettingStarted.html')
|
else:
|
||||||
self.transform = sitk.ReadTransform(str(Path(__file__).parent / 'transform.txt'))
|
self.transform = sitk.ReadTransform(str(Path(__file__).parent / 'transform.txt'))
|
||||||
self.dparameters = [0., 0., 0., 0., 0., 0.]
|
self.dparameters = [0., 0., 0., 0., 0., 0.]
|
||||||
self.shape = [512., 512.]
|
self.shape = [512., 512.]
|
||||||
@@ -275,6 +275,9 @@ class Transform:
|
|||||||
@classmethod
|
@classmethod
|
||||||
def register(cls, fix, mov, kind=None):
|
def register(cls, fix, mov, kind=None):
|
||||||
""" kind: 'affine', 'translation', 'rigid' """
|
""" kind: 'affine', 'translation', 'rigid' """
|
||||||
|
if sitk is None:
|
||||||
|
raise ImportError('SimpleElastix is not installed: '
|
||||||
|
'https://simpleelastix.readthedocs.io/GettingStarted.html')
|
||||||
new = cls()
|
new = cls()
|
||||||
kind = kind or 'affine'
|
kind = kind or 'affine'
|
||||||
new.shape = fix.shape
|
new.shape = fix.shape
|
||||||
@@ -342,7 +345,7 @@ class Transform:
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def cast_image(im):
|
def cast_image(im):
|
||||||
if not isinstance(im, sitk.Image):
|
if isinstance(im, sitk.Image):
|
||||||
im = sitk.GetImageFromArray(im)
|
im = sitk.GetImageFromArray(im)
|
||||||
return im
|
return im
|
||||||
|
|
||||||
@@ -376,24 +379,30 @@ class Transform:
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def parameters(self):
|
def parameters(self):
|
||||||
|
if self.transform is not None:
|
||||||
return list(self.transform.GetParameters())
|
return list(self.transform.GetParameters())
|
||||||
|
|
||||||
@parameters.setter
|
@parameters.setter
|
||||||
def parameters(self, value):
|
def parameters(self, value):
|
||||||
|
if self.transform is not None:
|
||||||
value = np.asarray(value)
|
value = np.asarray(value)
|
||||||
self.transform.SetParameters(value.tolist())
|
self.transform.SetParameters(value.tolist())
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def origin(self):
|
def origin(self):
|
||||||
|
if self.transform is not None:
|
||||||
return self.transform.GetFixedParameters()
|
return self.transform.GetFixedParameters()
|
||||||
|
|
||||||
@origin.setter
|
@origin.setter
|
||||||
def origin(self, value):
|
def origin(self, value):
|
||||||
|
if self.transform is not None:
|
||||||
value = np.asarray(value)
|
value = np.asarray(value)
|
||||||
self.transform.SetFixedParameters(value.tolist())
|
self.transform.SetFixedParameters(value.tolist())
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def inverse(self):
|
def inverse(self):
|
||||||
|
if self.is_unity():
|
||||||
|
return self
|
||||||
if self._last is None or self._last != self.asdict():
|
if self._last is None or self._last != self.asdict():
|
||||||
self._last = self.asdict()
|
self._last = self.asdict()
|
||||||
self._inverse = Transform.from_dict(self.asdict())
|
self._inverse = Transform.from_dict(self.asdict())
|
||||||
@@ -414,6 +423,9 @@ class Transform:
|
|||||||
if self.is_unity():
|
if self.is_unity():
|
||||||
return im
|
return im
|
||||||
else:
|
else:
|
||||||
|
if sitk is None:
|
||||||
|
raise ImportError('SimpleElastix is not installed: '
|
||||||
|
'https://simpleelastix.readthedocs.io/GettingStarted.html')
|
||||||
dtype = im.dtype
|
dtype = im.dtype
|
||||||
im = im.astype('float')
|
im = im.astype('float')
|
||||||
intp = sitk.sitkBSpline if np.issubdtype(dtype, np.floating) else sitk.sitkNearestNeighbor
|
intp = sitk.sitkBSpline if np.issubdtype(dtype, np.floating) else sitk.sitkNearestNeighbor
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[tool.poetry]
|
[tool.poetry]
|
||||||
name = "ndbioimage"
|
name = "ndbioimage"
|
||||||
version = "2023.10.3"
|
version = "2023.11.0"
|
||||||
description = "Bio image reading, metadata and some affine registration."
|
description = "Bio image reading, metadata and some affine registration."
|
||||||
authors = ["W. Pomp <w.pomp@nki.nl>"]
|
authors = ["W. Pomp <w.pomp@nki.nl>"]
|
||||||
license = "GPLv3"
|
license = "GPLv3"
|
||||||
@@ -34,6 +34,9 @@ test = ["pytest-xdist"]
|
|||||||
[tool.poetry.scripts]
|
[tool.poetry.scripts]
|
||||||
ndbioimage = "ndbioimage:main"
|
ndbioimage = "ndbioimage:main"
|
||||||
|
|
||||||
|
[tool.pytest.ini_options]
|
||||||
|
filterwarnings = ["ignore:::(colorcet)"]
|
||||||
|
|
||||||
[build-system]
|
[build-system]
|
||||||
requires = ["poetry-core"]
|
requires = ["poetry-core"]
|
||||||
build-backend = "poetry.core.masonry.api"
|
build-backend = "poetry.core.masonry.api"
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
import pickle
|
import pickle
|
||||||
import pytest
|
|
||||||
from pathlib import Path
|
|
||||||
from multiprocessing import active_children
|
from multiprocessing import active_children
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import pytest
|
||||||
from ndbioimage import Imread, ReaderNotFoundError
|
from ndbioimage import Imread, ReaderNotFoundError
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
23
tests/test_slicing.py
Normal file
23
tests/test_slicing.py
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
from itertools import combinations_with_replacement
|
||||||
|
from numbers import Number
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
import pytest
|
||||||
|
from ndbioimage import Imread
|
||||||
|
|
||||||
|
r = np.random.randint(0, 255, (64, 64, 2, 3, 4))
|
||||||
|
im = Imread(r)
|
||||||
|
a = np.array(im)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize('s', combinations_with_replacement(
|
||||||
|
(0, -1, 1, slice(None), slice(0, 1), slice(-1, 0), slice(1, 1)), 5))
|
||||||
|
def test_slicing(s):
|
||||||
|
s_im, s_a = im[s], a[s]
|
||||||
|
if isinstance(s_a, Number):
|
||||||
|
assert isinstance(s_im, Number)
|
||||||
|
assert s_im == s_a
|
||||||
|
else:
|
||||||
|
assert isinstance(s_im, Imread)
|
||||||
|
assert s_im.shape == s_a.shape
|
||||||
|
assert np.all(s_im == s_a)
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
import pytest
|
|
||||||
import numpy as np
|
|
||||||
from ndbioimage import Imread
|
|
||||||
from itertools import product
|
from itertools import product
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
import pytest
|
||||||
|
from ndbioimage import Imread
|
||||||
|
|
||||||
r = np.random.randint(0, 255, (64, 64, 2, 3, 4))
|
r = np.random.randint(0, 255, (64, 64, 2, 3, 4))
|
||||||
im = Imread(r)
|
im = Imread(r)
|
||||||
|
|||||||
Reference in New Issue
Block a user