コード例 #1
0
ファイル: test_viewer_image_io.py プロジェクト: kne42/napari
def test_add_multichannel_tiff(builtins, single_tiff):
    image_files = single_tiff
    viewer = ViewerModel()
    viewer.open(image_files, channel_axis=0, plugin=builtins.name)
    assert len(viewer.layers) == 2
    assert viewer.dims.ndim == 2
    assert isinstance(viewer.layers[0].data, np.ndarray)
    assert viewer.layers[0].data.shape == (15, 10)
    assert viewer.layers[0].data.dtype == np.uint8
コード例 #2
0
def test_add_vectors():
    """Test adding vectors."""
    viewer = ViewerModel()
    np.random.seed(0)
    data = 20 * np.random.random((10, 2, 2))
    viewer.add_vectors(data)
    assert len(viewer.layers) == 1
    assert np.all(viewer.layers[0].data == data)
    assert viewer.dims.ndim == 2
コード例 #3
0
def test_add_labels():
    """Test adding labels image."""
    viewer = ViewerModel()
    np.random.seed(0)
    data = np.random.randint(20, size=(10, 15))
    viewer.add_labels(data)
    assert len(viewer.layers) == 1
    assert np.all(viewer.layers[0].data == data)
    assert viewer.dims.ndim == 2
コード例 #4
0
def test_add_empty_points_on_top_of_image():
    viewer = ViewerModel()
    image = np.random.random((8, 64, 64))
    # add_image always returns the corresponding layer
    _ = viewer.add_image(image)
    layer = viewer.add_points(ndim=3)
    assert layer.ndim == 3
    layer.add([5.0, 32.0, 61.0])
    assert layer.data.shape == (1, 3)
コード例 #5
0
def test_grid():
    "Test grid_view"
    viewer = ViewerModel()

    np.random.seed(0)
    # Add image
    for i in range(6):
        data = np.random.random((15, 15))
        viewer.add_image(data)
    assert not viewer.grid.enabled
    assert viewer.grid.actual_shape(6) == (1, 1)
    assert viewer.grid.stride == 1
    translations = [layer.translate_grid for layer in viewer.layers]
    expected_translations = np.zeros((6, 2))
    np.testing.assert_allclose(translations, expected_translations)

    # enter grid view
    viewer.grid.enabled = True
    assert viewer.grid.enabled
    assert viewer.grid.actual_shape(6) == (2, 3)
    assert viewer.grid.stride == 1
    translations = [layer.translate_grid for layer in viewer.layers]
    expected_translations = [
        [0, 0],
        [0, 15],
        [0, 30],
        [15, 0],
        [15, 15],
        [15, 30],
    ]
    np.testing.assert_allclose(translations, expected_translations[::-1])

    # return to stack view
    viewer.grid.enabled = False
    assert not viewer.grid.enabled
    assert viewer.grid.actual_shape(6) == (1, 1)
    assert viewer.grid.stride == 1
    translations = [layer.translate_grid for layer in viewer.layers]
    expected_translations = np.zeros((6, 2))
    np.testing.assert_allclose(translations, expected_translations)

    # reenter grid view with new stride
    viewer.grid.stride = -2
    viewer.grid.enabled = True
    assert viewer.grid.enabled
    assert viewer.grid.actual_shape(6) == (2, 2)
    assert viewer.grid.stride == -2
    translations = [layer.translate_grid for layer in viewer.layers]
    expected_translations = [
        [0, 0],
        [0, 0],
        [0, 15],
        [0, 15],
        [15, 0],
        [15, 0],
    ]
    np.testing.assert_allclose(translations, expected_translations)
コード例 #6
0
def test_add_volume():
    """Test adding volume."""
    viewer = ViewerModel(ndisplay=3)
    np.random.seed(0)
    data = np.random.random((10, 15, 20))
    viewer.add_image(data)
    assert len(viewer.layers) == 1
    assert np.all(viewer.layers[0].data == data)
    assert viewer.dims.ndim == 3
コード例 #7
0
def test_new_labels_empty():
    """Test adding new labels layer to empty viewer."""
    viewer = ViewerModel()
    viewer._new_labels()
    assert len(viewer.layers) == 1
    assert np.max(viewer.layers[0].data) == 0
    assert viewer.dims.ndim == 2
    # Default shape when no data is present is 512x512
    np.testing.assert_equal(viewer.layers[0].data.shape, (512, 512))
コード例 #8
0
def test_new_shapes():
    """Test adding new shapes layer."""
    # Add labels to empty viewer
    viewer = ViewerModel()
    viewer.add_shapes()
    assert len(viewer.layers) == 1
    assert len(viewer.layers[0].data) == 0
    assert viewer.dims.ndim == 2

    # Add points with image already present
    viewer = ViewerModel()
    np.random.seed(0)
    data = np.random.random((10, 15))
    viewer.add_image(data)
    viewer.add_shapes()
    assert len(viewer.layers) == 2
    assert len(viewer.layers[1].data) == 0
    assert viewer.dims.ndim == 2
コード例 #9
0
ファイル: test_viewer_model.py プロジェクト: thewtex/napari
def test_add_pyramid():
    """Test adding image pyramid."""
    viewer = ViewerModel()
    shapes = [(40, 20), (20, 10), (10, 5)]
    np.random.seed(0)
    data = [np.random.random(s) for s in shapes]
    viewer.add_pyramid(data)
    assert len(viewer.layers) == 1
    assert np.all(viewer.layers[0].data == data)
コード例 #10
0
ファイル: test_viewer_image_io.py プロジェクト: kne42/napari
def test_add_single_filename(builtins, single_tiff):
    image_files = single_tiff[0]
    viewer = ViewerModel()
    viewer.open(image_files, plugin=builtins.name)
    assert len(viewer.layers) == 1
    assert viewer.dims.ndim == 3
    assert isinstance(viewer.layers[0].data, np.ndarray)
    assert viewer.layers[0].data.shape == (2, 15, 10)
    assert viewer.layers[0].data.dtype == np.uint8
コード例 #11
0
ファイル: test_viewer_image_io.py プロジェクト: kne42/napari
def test_add_many_tiffs(builtins, single_tiff):
    image_files = single_tiff * 3
    viewer = ViewerModel()
    viewer.open(image_files, stack=True, plugin=builtins.name)
    assert len(viewer.layers) == 1
    assert viewer.dims.ndim == 4
    assert isinstance(viewer.layers[0].data, da.Array)
    assert viewer.layers[0].data.shape == (3, 2, 15, 10)
    assert viewer.layers[0].data.dtype == np.uint8
コード例 #12
0
def test_no_warning_non_affine_slicing():
    """Test no warning if not slicing into an affine."""
    viewer = ViewerModel()
    np.random.seed(0)
    data = np.random.random((10, 10, 10))
    viewer.add_image(data, scale=[2, 1, 1], translate=[10, 15, 20])
    with pytest.warns(None) as recorded_warnings:
        viewer.layers[0].refresh()
    assert len(recorded_warnings) == 0
コード例 #13
0
ファイル: test_multichannel.py プロジェクト: kne42/napari
def test_multichannel(shape, kwargs):
    """Test adding multichannel image."""
    viewer = ViewerModel()
    np.random.seed(0)
    data = np.random.random(shape or (15, 10, 5))
    channel_axis = kwargs.pop('channel_axis', -1)
    viewer.add_image(data, channel_axis=channel_axis, **kwargs)

    # make sure the right number of layers got added
    n_channels = data.shape[channel_axis]
    assert len(viewer.layers) == n_channels

    for i in range(n_channels):
        # make sure that the data has been divided into layers
        assert np.all(viewer.layers[i].data == data.take(i, axis=channel_axis))
        # make sure colors have been assigned properly
        if 'colormap' not in kwargs:
            if n_channels == 1:
                assert viewer.layers[i].colormap.name == 'gray'
            elif n_channels == 2:
                assert viewer.layers[i].colormap.name == two_colormaps[i]
            else:
                assert viewer.layers[i].colormap.name == base_colormaps[i]
        if 'blending' not in kwargs:
            assert (viewer.layers[i].blending == 'translucent_no_depth'
                    if i == 0 else 'additive')
        for key, expectation in kwargs.items():
            # broadcast exceptions
            if key in {
                    'scale',
                    'translate',
                    'rotate',
                    'shear',
                    'contrast_limits',
                    'metadata',
                    'experimental_clipping_planes',
            }:
                expectation = ensure_sequence_of_iterables(expectation,
                                                           repeat_empty=True)
            elif key == 'colormap' and expectation is not None:
                if isinstance(expectation, list):
                    exp = [ensure_colormap(c).name for c in expectation]
                else:
                    exp = ensure_colormap(expectation).name
                expectation = ensure_iterable(exp)
            else:
                expectation = ensure_iterable(expectation)
            expectation = [v for i, v in zip(range(i + 1), expectation)]

            result = getattr(viewer.layers[i], key)
            if key == 'colormap':  # colormaps are tuples of (name, cmap)
                result = result.name
            if isinstance(result, np.ndarray):
                np.testing.assert_almost_equal(result, expectation[i])
            else:
                assert result == expectation[i]
コード例 #14
0
def test_names():
    """Test adding multichannel image with custom names."""
    viewer = ViewerModel()
    np.random.seed(0)
    data = np.random.random((15, 10, 5))
    names = ['multi ' + str(i + 3) for i in range(data.shape[-1])]
    viewer.add_multichannel(data, name=names)
    assert len(viewer.layers) == data.shape[-1]
    for i in range(data.shape[-1]):
        assert viewer.layers[i].name == names[i]

    viewer = ViewerModel()
    name = 'example'
    names = [name
             ] + [name + ' ' + str(i + 1) for i in range(data.shape[-1] - 1)]
    viewer.add_multichannel(data, name=name)
    assert len(viewer.layers) == data.shape[-1]
    for i in range(data.shape[-1]):
        assert viewer.layers[i].name == names[i]
コード例 #15
0
def test_add_multiscale():
    """Test adding image multiscale."""
    viewer = ViewerModel()
    shapes = [(40, 20), (20, 10), (10, 5)]
    np.random.seed(0)
    data = [np.random.random(s) for s in shapes]
    viewer.add_image(data, multiscale=True)
    assert len(viewer.layers) == 1
    assert np.all(viewer.layers[0].data == data)
    assert viewer.dims.ndim == 2
コード例 #16
0
def test_add_layer_from_data(data):
    # make sure adding valid layer data calls the proper corresponding add_*
    # method for all layer types
    viewer = ViewerModel()
    viewer._add_layer_from_data(*data)

    # make sure a layer of the correct type got added
    assert len(viewer.layers) == 1
    expected_layer_type = data[2] if len(data) > 2 else 'image'
    assert viewer.layers[0]._type_string == expected_layer_type
コード例 #17
0
ファイル: test_qt_play.py プロジェクト: shalevy1/napari
def view(qtbot):
    """basic viewer with data that we will use a few times"""
    viewer = ViewerModel()
    view = QtViewer(viewer)
    qtbot.addWidget(view)

    np.random.seed(0)
    data = np.random.random((10, 10, 15))
    viewer.add_image(data)
    return view
コード例 #18
0
ファイル: test_multichannel.py プロジェクト: vilim/napari
def test_multichannel_dask_array():
    """Test adding multichannel dask array."""
    viewer = ViewerModel()
    np.random.seed(0)
    data = da.random.random((2, 10, 10, 5))
    viewer.add_image(data, channel_axis=0)
    assert len(viewer.layers) == data.shape[0]
    for i in range(data.shape[0]):
        assert viewer.layers[i].data.shape == data.shape[1:]
        assert isinstance(viewer.layers[i].data, da.Array)
コード例 #19
0
def test_open_or_get_error_preferred_fails(tmp_path):
    viewer = ViewerModel()
    pth = tmp_path / 'my-file.npy'

    with restore_settings_on_exit():
        get_settings().plugins.extension2reader = {'.npy': 'napari'}

        with pytest.raises(ReaderPluginError,
                           match='Tried opening with napari, but failed.'):
            viewer._open_or_raise_error([str(pth)])
コード例 #20
0
def test_open_labels(suffix):
    viewer = ViewerModel()
    blobs = binary_blobs(length=128, volume_fraction=0.1, n_dim=2)
    labeled = ndi.label(blobs)[0].astype(np.uint8)
    with temporary_file(suffix) as fout:
        imwrite(fout, labeled, format=suffix)
        viewer.open(fout, layer_type='labels')
        assert len(viewer.layers) == 1
        assert np.all(labeled == viewer.layers[0].data)
        assert isinstance(viewer.layers[0], Labels)
コード例 #21
0
def test_open_or_get_error_multiple_readers(mock_npe2_pm, tmp_reader):
    """Assert error is returned when multiple plugins are available to read."""
    viewer = ViewerModel()

    tmp_reader(mock_npe2_pm, 'p1')
    tmp_reader(mock_npe2_pm, 'p2')

    with pytest.raises(MultipleReaderError,
                       match='Multiple plugins found capable'):
        viewer._open_or_raise_error(['my_file.fake'])
コード例 #22
0
def test_split_rgb_image():
    """Test adding multichannel image with custom colormaps."""
    viewer = ViewerModel()
    np.random.seed(0)
    data = np.random.random((15, 10, 3))
    colormaps = ['red', 'green', 'blue']
    viewer.add_image(data, colormap=colormaps, channel_axis=-1)
    assert len(viewer.layers) == data.shape[-1]
    for i in range(data.shape[-1]):
        assert viewer.layers[i].colormap[0] == colormaps[i]
コード例 #23
0
def test_multichannel():
    """Test adding multichannel image."""
    viewer = ViewerModel()
    np.random.seed(0)
    data = np.random.random((15, 10, 5))
    viewer.add_image(data, channel_axis=-1)
    assert len(viewer.layers) == data.shape[-1]
    for i in range(data.shape[-1]):
        assert np.all(viewer.layers[i].data == data.take(i, axis=-1))
        assert viewer.layers[i].colormap[0] == base_colormaps[i]
コード例 #24
0
def test_rgb_images():
    """Test adding multiple rgb images."""
    viewer = ViewerModel()
    np.random.seed(0)
    data = np.random.random((15, 10, 5, 3))
    viewer.add_image(data, channel_axis=2, rgb=True)
    assert len(viewer.layers) == data.shape[2]
    for i in range(data.shape[-1]):
        assert viewer.layers[i].rgb is True
        assert viewer.layers[i]._data_view.ndim == 3
コード例 #25
0
def test_add_multi_png_defaults(two_pngs):
    image_files = two_pngs
    viewer = ViewerModel()
    viewer.open(image_files, stack=True, plugin='builtins')
    assert len(viewer.layers) == 1
    assert viewer.dims.ndim == 3
    assert isinstance(viewer.layers[0].data, da.Array)
    assert viewer.layers[0].data.shape == (2, 512, 512)

    viewer.open(image_files, stack=False, plugin='builtins')
    assert len(viewer.layers) == 3
コード例 #26
0
def test_update_scale():
    viewer = ViewerModel()
    np.random.seed(0)
    shape = (10, 15, 20)
    data = np.random.random(shape)
    viewer.add_image(data)
    assert viewer.dims.range == tuple((0.0, x - 1.0, 1.0) for x in shape)
    scale = (3.0, 2.0, 1.0)
    viewer.layers[0].scale = scale
    assert viewer.dims.range == tuple(
        (0.0, (x - 1) * s, s) for x, s in zip(shape, scale))
コード例 #27
0
def test_active_layer_status_update():
    """Test status updates from active layer on cursor move."""
    viewer = ViewerModel()
    np.random.seed(0)
    viewer.add_image(np.random.random((5, 5, 10, 15)))
    viewer.add_image(np.random.random((5, 6, 5, 10, 15)))
    assert len(viewer.layers) == 2
    assert viewer.active_layer == viewer.layers[1]

    viewer.cursor.position = [1, 1, 1, 1, 1]
    assert viewer.status == viewer.active_layer.status
コード例 #28
0
def test_add_zarr():
    viewer = ViewerModel()
    image = np.random.random((10, 20, 20))
    with TemporaryDirectory(suffix='.zarr') as fout:
        z = zarr.open(fout, 'a', shape=image.shape)
        z[:] = image
        viewer.add_image(path=[fout])
        assert len(viewer.layers) == 1
        # Note: due to lazy loading, the next line needs to happen within
        # the context manager. Alternatively, we could convert to NumPy here.
        np.testing.assert_array_equal(image, viewer.layers[0].data)
コード例 #29
0
def test_multichannel_index_error_hint():
    """Test multichannel error when arg length != n_channels."""
    viewer = ViewerModel()
    np.random.seed(0)
    data = da.random.random((5, 10, 5))
    with pytest.raises(IndexError) as e:
        viewer.add_image(data, channel_axis=0, name=['a', 'b'])
    assert (
        "Requested channel_axis (0) had length 5, but the "
        "'name' argument only provided 2 values." in str(e)
    )
コード例 #30
0
def test_add_zarr_1d_array_is_ignored():
    # For more details: https://github.com/napari/napari/issues/1471
    viewer = ViewerModel()
    with TemporaryDirectory(suffix='.zarr') as zarr_dir:
        z = zarr.open(zarr_dir, 'w')
        z['1d'] = np.zeros(3)

        image_path = os.path.join(zarr_dir, '1d')
        viewer.open(image_path, plugin='builtins')

        assert len(viewer.layers) == 0