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
)
| 162 | |
| 163 | |
| 164 | def 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 | |
| 207 | def iter_patch_position( |
no test coverage detected
searching dependent graphs…