Load image file and metadata from the given filename(s). If `reader` is not specified, this class automatically chooses readers based on the reversed order of registered readers `self.readers`. Args: filename: path file or file-like object or a list of f
(self, filename: Sequence[PathLike] | PathLike, reader: ImageReader | None = None)
| 235 | self.readers.append(reader) |
| 236 | |
| 237 | def __call__(self, filename: Sequence[PathLike] | PathLike, reader: ImageReader | None = None): |
| 238 | """ |
| 239 | Load image file and metadata from the given filename(s). |
| 240 | If `reader` is not specified, this class automatically chooses readers based on the |
| 241 | reversed order of registered readers `self.readers`. |
| 242 | |
| 243 | Args: |
| 244 | filename: path file or file-like object or a list of files. |
| 245 | will save the filename to meta_data with key `filename_or_obj`. |
| 246 | if provided a list of files, use the filename of first file to save, |
| 247 | and will stack them together as multi-channels data. |
| 248 | if provided directory path instead of file path, will treat it as |
| 249 | DICOM images series and read. |
| 250 | reader: runtime reader to load image file and metadata. |
| 251 | |
| 252 | """ |
| 253 | filename = tuple( |
| 254 | f"{Path(s).expanduser()}" if self.expanduser else s for s in ensure_tuple(filename) # allow Path objects |
| 255 | ) |
| 256 | img, err = None, [] |
| 257 | if reader is not None: |
| 258 | img = reader.read(filename) # runtime specified reader |
| 259 | else: |
| 260 | for reader in self.readers[::-1]: |
| 261 | if self.auto_select: # rely on the filename extension to choose the reader |
| 262 | if reader.verify_suffix(filename): |
| 263 | img = reader.read(filename) |
| 264 | break |
| 265 | else: # try the user designated readers |
| 266 | try: |
| 267 | img = reader.read(filename) |
| 268 | except Exception as e: |
| 269 | err.append(traceback.format_exc()) |
| 270 | logging.getLogger(self.__class__.__name__).debug(e, exc_info=True) |
| 271 | logging.getLogger(self.__class__.__name__).info( |
| 272 | f"{reader.__class__.__name__}: unable to load {filename}.\n" |
| 273 | ) |
| 274 | else: |
| 275 | err = [] |
| 276 | break |
| 277 | |
| 278 | if img is None or reader is None: |
| 279 | if isinstance(filename, Sequence) and len(filename) == 1: |
| 280 | filename = filename[0] |
| 281 | msg = "\n".join([f"{e}" for e in err]) |
| 282 | raise RuntimeError( |
| 283 | f"{self.__class__.__name__} cannot find a suitable reader for file: {filename}.\n" |
| 284 | " Please install the reader libraries, see also the installation instructions:\n" |
| 285 | " https://monai.readthedocs.io/en/latest/installation.html#installing-the-recommended-dependencies.\n" |
| 286 | f" The current registered: {self.readers}.\n{msg}" |
| 287 | ) |
| 288 | img_array: NdarrayOrTensor |
| 289 | img_array, meta_data = reader.get_data(img) |
| 290 | img_array = convert_to_dst_type(img_array, dst=img_array, dtype=self.dtype)[0] |
| 291 | if not isinstance(meta_data, dict): |
| 292 | raise ValueError(f"`meta_data` must be a dict, got type {type(meta_data)}.") |
| 293 | # make sure all elements in metadata are little endian |
| 294 | meta_data = switch_endianness(meta_data, "<") |
nothing calls this directly
no test coverage detected