MCPcopy Create free account
hub / github.com/Project-MONAI/MONAI / dense_patch_slices

Function dense_patch_slices

monai/data/utils.py:164–204  ·  view source on GitHub ↗

Enumerate all slices defining ND patches of size `patch_size` from an `image_size` input image. Args: image_size: dimensions of image to iterate over patch_size: size of patches to generate slices scan_interval: dense patch sampling interval return_slice: wh

(
    image_size: Sequence[int], patch_size: Sequence[int], scan_interval: Sequence[int], return_slice: bool = True
)

Source from the content-addressed store, hash-verified

162
163
164def dense_patch_slices(
165 image_size: Sequence[int], patch_size: Sequence[int], scan_interval: Sequence[int], return_slice: bool = True
166) -> list[tuple[slice, ...]]:
167 """
168 Enumerate all slices defining ND patches of size `patch_size` from an `image_size` input image.
169
170 Args:
171 image_size: dimensions of image to iterate over
172 patch_size: size of patches to generate slices
173 scan_interval: dense patch sampling interval
174 return_slice: whether to return a list of slices (or tuples of indices), defaults to True
175
176 Returns:
177 a list of slice objects defining each patch
178
179 """
180 num_spatial_dims = len(image_size)
181 patch_size = get_valid_patch_size(image_size, patch_size)
182 scan_interval = ensure_tuple_size(scan_interval, num_spatial_dims)
183
184 scan_num = []
185 for i in range(num_spatial_dims):
186 if scan_interval[i] == 0:
187 scan_num.append(1)
188 else:
189 num = int(math.ceil(float(image_size[i]) / scan_interval[i]))
190 scan_dim = first(d for d in range(num) if d * scan_interval[i] + patch_size[i] >= image_size[i])
191 scan_num.append(scan_dim + 1 if scan_dim is not None else 1)
192
193 starts = []
194 for dim in range(num_spatial_dims):
195 dim_starts = []
196 for idx in range(scan_num[dim]):
197 start_idx = idx * scan_interval[dim]
198 start_idx -= max(start_idx + patch_size[dim] - image_size[dim], 0)
199 dim_starts.append(start_idx)
200 starts.append(dim_starts)
201 out = np.asarray([x.flatten() for x in np.meshgrid(*starts, indexing="ij")]).T
202 if return_slice:
203 return [tuple(slice(s, s + patch_size[d]) for d, s in enumerate(x)) for x in out]
204 return [tuple((s, s + patch_size[d]) for d, s in enumerate(x)) for x in out] # type: ignore
205
206
207def iter_patch_position(

Callers 1

sliding_window_inferenceFunction · 0.90

Calls 6

ensure_tuple_sizeFunction · 0.90
firstFunction · 0.90
get_valid_patch_sizeFunction · 0.85
maxFunction · 0.85
appendMethod · 0.45
flattenMethod · 0.45

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…