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

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 

6 

7 

8def test_image_name(): 

9 openslide_server = OpenSlideServer(multi_resolution_uint8_3channels.get_path()) 

10 

11 name = openslide_server.metadata.name 

12 

13 assert name == multi_resolution_uint8_3channels.get_name() 

14 

15 openslide_server.close() 

16 

17 

18def test_image_shapes(): 

19 openslide_server = OpenSlideServer(multi_resolution_uint8_3channels.get_path()) 

20 

21 shapes = openslide_server.metadata.shapes 

22 

23 # only the full resolution can be detected 

24 assert shapes[0] == multi_resolution_uint8_3channels.get_shapes()[0] 

25 

26 openslide_server.close() 

27 

28 

29def test_is_rgb(): 

30 openslide_server = OpenSlideServer(multi_resolution_uint8_3channels.get_path()) 

31 

32 is_rgb = openslide_server.metadata.is_rgb 

33 

34 assert is_rgb 

35 

36 openslide_server.close() 

37 

38 

39def test_image_dtype(): 

40 openslide_server = OpenSlideServer(multi_resolution_uint8_3channels.get_path()) 

41 

42 dtype = openslide_server.metadata.dtype 

43 

44 assert dtype == multi_resolution_uint8_3channels.get_dtype() 

45 

46 openslide_server.close() 

47 

48 

49def test_number_of_channels_when_alpha_stripped(): 

50 openslide_server = OpenSlideServer(multi_resolution_uint8_3channels.get_path()) 

51 

52 n_channels = openslide_server.metadata.n_channels 

53 

54 assert n_channels == 3 

55 

56 openslide_server.close() 

57 

58 

59def test_number_of_channels_when_alpha_not_stripped(): 

60 openslide_server = OpenSlideServer( 

61 multi_resolution_uint8_3channels.get_path(), strip_alpha=False 

62 ) 

63 

64 n_channels = openslide_server.metadata.n_channels 

65 

66 assert n_channels == 4 

67 

68 openslide_server.close() 

69 

70 

71def test_number_of_channels_when_single_channel(): 

72 openslide_server = OpenSlideServer( 

73 multi_resolution_uint8_3channels.get_path(), single_channel=True 

74 ) 

75 

76 n_channels = openslide_server.metadata.n_channels 

77 

78 assert n_channels == 1 

79 

80 openslide_server.close() 

81 

82 

83def test_downsamples(): 

84 openslide_server = OpenSlideServer(multi_resolution_uint8_3channels.get_path()) 

85 

86 downsamples = openslide_server.metadata.downsamples 

87 

88 # only the full resolution can be detected 

89 assert downsamples[0] == multi_resolution_uint8_3channels.get_downsamples()[0] 

90 

91 openslide_server.close() 

92 

93 

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 ) 

114 

115 image = openslide_server.read_region( 

116 downsample, 

117 Region2D( 

118 width=openslide_server.metadata.width, 

119 height=openslide_server.metadata.height, 

120 ), 

121 ) 

122 

123 np.testing.assert_array_equal(image, expected_pixels) 

124 

125 openslide_server.close() 

126 

127 

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 )