Source code for monai.apps.reconstruction.fastmri_reader

# Copyright (c) MONAI Consortium
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#     http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from __future__ import annotations

import os
from collections.abc import Sequence

import numpy as np
from numpy import ndarray

from monai.config import PathLike
from monai.data.image_reader import ImageReader
from monai.data.utils import is_supported_format
from monai.utils import FastMRIKeys, optional_import, require_pkg

h5py, has_h5py = optional_import("h5py")


[docs] @require_pkg(pkg_name="h5py") class FastMRIReader(ImageReader): """ Load fastMRI files with '.h5' suffix. fastMRI files, when loaded with "h5py", are HDF5 dictionary-like datasets. The keys are: - kspace: contains the fully-sampled kspace - reconstruction_rss: contains the root sum of squares of ifft of kspace. This is the ground-truth image. It also has several attributes with the following keys: - acquisition (str): acquisition mode of the data (e.g., AXT2 denotes T2 brain MRI scans) - max (float): dynamic range of the data - norm (float): norm of the kspace - patient_id (str): the patient's id whose measurements were recorded """
[docs] def verify_suffix(self, filename: Sequence[PathLike] | PathLike) -> bool: """ Verify whether the specified file format is supported by h5py reader. Args: filename: file name """ suffixes: Sequence[str] = [".h5"] return has_h5py and is_supported_format(filename, suffixes)
[docs] def read(self, data: Sequence[PathLike] | PathLike) -> dict: # type: ignore """ Read data from specified h5 file. Note that the returned object is a dictionary. Args: data: file name to read. """ if isinstance(data, (tuple, list)): data = data[0] with h5py.File(data, "r") as f: # extract everything from the ht5 file dat = dict( [(key, f[key][()]) for key in f] + [(key, f.attrs[key]) for key in f.attrs] + [(FastMRIKeys.FILENAME, os.path.basename(data))] # type: ignore ) f.close() return dat
[docs] def get_data(self, dat: dict) -> tuple[ndarray, dict]: """ Extract data array and metadata from the loaded data and return them. This function returns two objects, first is numpy array of image data, second is dict of metadata. Args: dat: a dictionary loaded from an h5 file """ header = self._get_meta_dict(dat) data: ndarray = np.array(dat[FastMRIKeys.KSPACE]) header[FastMRIKeys.MASK] = ( np.expand_dims(np.array(dat[FastMRIKeys.MASK]), 0)[None, ..., None] if FastMRIKeys.MASK in dat.keys() else np.zeros(data.shape) ) return data, header
def _get_meta_dict(self, dat: dict) -> dict: """ Get all the metadata of the loaded dict and return the meta dict. Args: dat: a dictionary object loaded from an h5 file. """ return {k.value: dat[k.value] for k in FastMRIKeys if k.value in dat}