- 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
- more image formats
- re-implement transforms

View File

@@ -277,7 +277,8 @@ class Imread(np.lib.mixins.NDArrayOperatorsMixin, ABC):
new_slice.append(s[e])
# 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()
else:
new = View(self)

View File

@@ -36,9 +36,9 @@ try:
try:
import jpype.imports
from loci.common import DebugTools # noqa
from loci.formats import ImageReader # noqa
from loci.formats import ChannelSeparator # noqa
from loci.formats import FormatTools # noqa
from loci.formats import ImageReader # noqa
from loci.formats import MetadataTools # noqa
DebugTools.setRootLevel("ERROR")

View File

@@ -1,3 +1,4 @@
from pathlib import Path
__all__ = [file.stem for file in Path(__file__).parent.iterdir()
if file.suffix == ".py" and not file == Path(__file__) and not file.stem.startswith('.')]

View File

@@ -1,10 +1,11 @@
import multiprocessing
import numpy as np
from abc import ABC
from multiprocessing import queues
from traceback import print_exc
from .. import AbstractReader, JVM
import numpy as np
from .. import JVM, AbstractReader
jars = {'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
from lxml import etree
from ome_types import model
from abc import ABC
from functools import cached_property
from itertools import product
from pathlib import Path
import czifile
import numpy as np
from lxml import etree
from ome_types import model
from .. import AbstractReader

View File

@@ -1,12 +1,14 @@
from abc import ABC
from tifffile import TiffFile
from functools import cached_property
from itertools import product
from ome_types import model
from pathlib import Path
from struct import unpack
from warnings import warn
import numpy as np
from ome_types import model
from tifffile import TiffFile
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
from ome_types import model
from functools import cached_property
from abc import ABC
from .. import AbstractReader
from itertools import product
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 yaml
import re
from pathlib import Path
from functools import cached_property
from ome_types import model
from ome_types.units import _quantity_property # noqa
from itertools import product
from datetime import datetime
from abc import ABC
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 tifffile
import yaml
from abc import ABC
from functools import cached_property
from ome_types import model
from pathlib import Path
from itertools import product
from .. import AbstractReader

View File

@@ -4,7 +4,7 @@ from pathlib import Path
import numpy as np
import yaml
from parfor import pmap, Chunks
from parfor import Chunks, pmap
from skimage import filters
from tiffwrite import IJTiffFile
from tqdm.auto import tqdm
@@ -255,8 +255,8 @@ class Transforms(dict):
class Transform:
def __init__(self):
if sitk is None:
raise ImportError('SimpleElastix is not installed: '
'https://simpleelastix.readthedocs.io/GettingStarted.html')
self.transform = None
else:
self.transform = sitk.ReadTransform(str(Path(__file__).parent / 'transform.txt'))
self.dparameters = [0., 0., 0., 0., 0., 0.]
self.shape = [512., 512.]
@@ -275,6 +275,9 @@ class Transform:
@classmethod
def register(cls, fix, mov, kind=None):
""" kind: 'affine', 'translation', 'rigid' """
if sitk is None:
raise ImportError('SimpleElastix is not installed: '
'https://simpleelastix.readthedocs.io/GettingStarted.html')
new = cls()
kind = kind or 'affine'
new.shape = fix.shape
@@ -342,7 +345,7 @@ class Transform:
@staticmethod
def cast_image(im):
if not isinstance(im, sitk.Image):
if isinstance(im, sitk.Image):
im = sitk.GetImageFromArray(im)
return im
@@ -376,24 +379,30 @@ class Transform:
@property
def parameters(self):
if self.transform is not None:
return list(self.transform.GetParameters())
@parameters.setter
def parameters(self, value):
if self.transform is not None:
value = np.asarray(value)
self.transform.SetParameters(value.tolist())
@property
def origin(self):
if self.transform is not None:
return self.transform.GetFixedParameters()
@origin.setter
def origin(self, value):
if self.transform is not None:
value = np.asarray(value)
self.transform.SetFixedParameters(value.tolist())
@property
def inverse(self):
if self.is_unity():
return self
if self._last is None or self._last != self.asdict():
self._last = self.asdict()
self._inverse = Transform.from_dict(self.asdict())
@@ -414,6 +423,9 @@ class Transform:
if self.is_unity():
return im
else:
if sitk is None:
raise ImportError('SimpleElastix is not installed: '
'https://simpleelastix.readthedocs.io/GettingStarted.html')
dtype = im.dtype
im = im.astype('float')
intp = sitk.sitkBSpline if np.issubdtype(dtype, np.floating) else sitk.sitkNearestNeighbor

View File

@@ -1,6 +1,6 @@
[tool.poetry]
name = "ndbioimage"
version = "2023.10.3"
version = "2023.11.0"
description = "Bio image reading, metadata and some affine registration."
authors = ["W. Pomp <w.pomp@nki.nl>"]
license = "GPLv3"
@@ -34,6 +34,9 @@ test = ["pytest-xdist"]
[tool.poetry.scripts]
ndbioimage = "ndbioimage:main"
[tool.pytest.ini_options]
filterwarnings = ["ignore:::(colorcet)"]
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

View File

@@ -1,7 +1,8 @@
import pickle
import pytest
from pathlib import Path
from multiprocessing import active_children
from pathlib import Path
import pytest
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
import numpy as np
import pytest
from ndbioimage import Imread
r = np.random.randint(0, 255, (64, 64, 2, 3, 4))
im = Imread(r)