Coverage for tests/images/test_openslide_server.py: 100%
60 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-10-07 15:29 +0000
« prev ^ index » next coverage.py v7.6.12, created at 2025-10-07 15:29 +0000
1import numpy as np
2from qubalab.images.openslide_server import OpenSlideServer
3from qubalab.images.region_2d import Region2D
4from qubalab.images.metadata.pixel_calibration import PixelCalibration, PixelLength
5from ..res import multi_resolution_uint8_3channels
8def test_image_name():
9 openslide_server = OpenSlideServer(multi_resolution_uint8_3channels.get_path())
11 name = openslide_server.metadata.name
13 assert name == multi_resolution_uint8_3channels.get_name()
15 openslide_server.close()
18def test_image_shapes():
19 openslide_server = OpenSlideServer(multi_resolution_uint8_3channels.get_path())
21 shapes = openslide_server.metadata.shapes
23 # only the full resolution can be detected
24 assert shapes[0] == multi_resolution_uint8_3channels.get_shapes()[0]
26 openslide_server.close()
29def test_is_rgb():
30 openslide_server = OpenSlideServer(multi_resolution_uint8_3channels.get_path())
32 is_rgb = openslide_server.metadata.is_rgb
34 assert is_rgb
36 openslide_server.close()
39def test_image_dtype():
40 openslide_server = OpenSlideServer(multi_resolution_uint8_3channels.get_path())
42 dtype = openslide_server.metadata.dtype
44 assert dtype == multi_resolution_uint8_3channels.get_dtype()
46 openslide_server.close()
49def test_number_of_channels_when_alpha_stripped():
50 openslide_server = OpenSlideServer(multi_resolution_uint8_3channels.get_path())
52 n_channels = openslide_server.metadata.n_channels
54 assert n_channels == 3
56 openslide_server.close()
59def test_number_of_channels_when_alpha_not_stripped():
60 openslide_server = OpenSlideServer(
61 multi_resolution_uint8_3channels.get_path(), strip_alpha=False
62 )
64 n_channels = openslide_server.metadata.n_channels
66 assert n_channels == 4
68 openslide_server.close()
71def test_number_of_channels_when_single_channel():
72 openslide_server = OpenSlideServer(
73 multi_resolution_uint8_3channels.get_path(), single_channel=True
74 )
76 n_channels = openslide_server.metadata.n_channels
78 assert n_channels == 1
80 openslide_server.close()
83def test_downsamples():
84 openslide_server = OpenSlideServer(multi_resolution_uint8_3channels.get_path())
86 downsamples = openslide_server.metadata.downsamples
88 # only the full resolution can be detected
89 assert downsamples[0] == multi_resolution_uint8_3channels.get_downsamples()[0]
91 openslide_server.close()
94def test_read_full_resolution_image():
95 level = 0
96 full_resolution = multi_resolution_uint8_3channels.get_shapes()[level]
97 downsample = multi_resolution_uint8_3channels.get_downsamples()[level]
98 openslide_server = OpenSlideServer(multi_resolution_uint8_3channels.get_path())
99 expected_pixels = np.array(
100 [
101 [
102 [
103 multi_resolution_uint8_3channels.get_pixel_value(
104 downsample, x, y, c
105 )
106 for x in range(full_resolution.x)
107 ]
108 for y in range(full_resolution.y)
109 ]
110 for c in range(full_resolution.c)
111 ],
112 multi_resolution_uint8_3channels.get_dtype(),
113 )
115 image = openslide_server.read_region(
116 downsample,
117 Region2D(
118 width=openslide_server.metadata.width,
119 height=openslide_server.metadata.height,
120 ),
121 )
123 np.testing.assert_array_equal(image, expected_pixels)
125 openslide_server.close()
128def test_recursion():
129 openslide_server = OpenSlideServer(multi_resolution_uint8_3channels.get_path())
130 full_resolution = multi_resolution_uint8_3channels.get_shapes()[0]
131 downsamples = [1, 2, 4]
132 images = openslide_server.to_dask(downsamples)
133 assert all(
134 a == b
135 for a, b in zip(
136 [image.shape[2] for image in images],
137 [full_resolution.x / i for i in downsamples],
138 )
139 )