- Slicing bugfix.

- Sort imports.
- Make sitk-elastix optional again.
This commit is contained in:
Wim Pomp
2023-11-20 14:47:47 +01:00
parent 2dccbf1cef
commit 5a34adef7b
15 changed files with 92 additions and 41 deletions

View File

@@ -77,4 +77,3 @@ for example: any file handles
# TODO # TODO
- more image formats - more image formats
- re-implement transforms

View File

@@ -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)

View File

@@ -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")

View File

@@ -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('.')]

View File

@@ -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'}

View File

@@ -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

View File

@@ -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

View File

@@ -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):

View File

@@ -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

View File

@@ -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

View File

@@ -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,9 +255,9 @@ 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.]
self.origin = [255.5, 255.5] self.origin = [255.5, 255.5]
@@ -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):
return list(self.transform.GetParameters()) if self.transform is not None:
return list(self.transform.GetParameters())
@parameters.setter @parameters.setter
def parameters(self, value): def parameters(self, value):
value = np.asarray(value) if self.transform is not None:
self.transform.SetParameters(value.tolist()) value = np.asarray(value)
self.transform.SetParameters(value.tolist())
@property @property
def origin(self): def origin(self):
return self.transform.GetFixedParameters() if self.transform is not None:
return self.transform.GetFixedParameters()
@origin.setter @origin.setter
def origin(self, value): def origin(self, value):
value = np.asarray(value) if self.transform is not None:
self.transform.SetFixedParameters(value.tolist()) value = np.asarray(value)
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

View File

@@ -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"

View File

@@ -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
View 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)

View File

@@ -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)