86 lines
2.7 KiB
Python
86 lines
2.7 KiB
Python
from tempfile import NamedTemporaryFile
|
|
|
|
import numpy as np
|
|
from skimage.io import imread, imsave, plugin_order
|
|
|
|
from skimage._shared import testing
|
|
from skimage._shared.testing import fetch, assert_stacklevel
|
|
|
|
import pytest
|
|
|
|
|
|
def test_prefered_plugin():
|
|
# Don't call use_plugin("imageio") before, this way we test that imageio is used
|
|
# by default
|
|
order = plugin_order()
|
|
assert order["imread"][0] == "imageio"
|
|
assert order["imsave"][0] == "imageio"
|
|
assert order["imread_collection"][0] == "imageio"
|
|
|
|
|
|
def test_imageio_as_gray():
|
|
img = imread(fetch('data/color.png'), as_gray=True)
|
|
assert img.ndim == 2
|
|
assert img.dtype == np.float64
|
|
img = imread(fetch('data/camera.png'), as_gray=True)
|
|
# check that conversion does not happen for a gray image
|
|
assert np.dtype(img.dtype).char in np.typecodes['AllInteger']
|
|
|
|
|
|
def test_imageio_palette():
|
|
img = imread(fetch('data/palette_color.png'))
|
|
assert img.ndim == 3
|
|
|
|
|
|
def test_imageio_truncated_jpg():
|
|
# imageio>2.0 uses Pillow / PIL to try and load the file.
|
|
# Oddly, PIL explicitly raises a SyntaxError when the file read fails.
|
|
# The exception type changed from SyntaxError to OSError in PIL 8.2.0, so
|
|
# allow for either to be raised.
|
|
with testing.raises((OSError, SyntaxError)):
|
|
imread(fetch('data/truncated.jpg'))
|
|
|
|
|
|
class TestSave:
|
|
@pytest.mark.parametrize(
|
|
"shape,dtype",
|
|
[
|
|
# float32, float64 can't be saved as PNG and raise
|
|
# uint32 is not roundtripping properly
|
|
((10, 10), np.uint8),
|
|
((10, 10), np.uint16),
|
|
((10, 10, 2), np.uint8),
|
|
((10, 10, 3), np.uint8),
|
|
((10, 10, 4), np.uint8),
|
|
],
|
|
)
|
|
def test_imsave_roundtrip(self, shape, dtype, tmp_path):
|
|
if np.issubdtype(dtype, np.floating):
|
|
min_ = 0
|
|
max_ = 1
|
|
else:
|
|
min_ = 0
|
|
max_ = np.iinfo(dtype).max
|
|
expected = np.linspace(
|
|
min_, max_, endpoint=True, num=np.prod(shape), dtype=dtype
|
|
)
|
|
expected = expected.reshape(shape)
|
|
file_path = tmp_path / "roundtrip.png"
|
|
imsave(file_path, expected)
|
|
actual = imread(file_path)
|
|
np.testing.assert_array_almost_equal(actual, expected)
|
|
|
|
def test_bool_array_save(self):
|
|
with NamedTemporaryFile(suffix='.png') as f:
|
|
fname = f.name
|
|
|
|
with pytest.warns(UserWarning, match=r'.* is a boolean image') as record:
|
|
a = np.zeros((5, 5), bool)
|
|
a[2, 2] = True
|
|
imsave(fname, a)
|
|
assert_stacklevel(record)
|
|
|
|
|
|
def test_return_class():
|
|
testing.assert_equal(type(imread(fetch('data/color.png'))), np.ndarray)
|