在 python 中调整 DICOM 图像的大小
Resize a DICOM image in python
我正在尝试将不同尺寸的 DICOM 图像调整为通用尺寸大小以训练我的神经网络。我认为 cv2 可以解决我的问题。但是我在我的 jupyter notebook
中得到了一个 'datatype not understood error'
我正在尝试创建一个可以预测图像 class 的张量流神经网络。因此,我需要用于第一层训练的通用尺寸的图像
这是我创建的函数:
IMG_PX_SIZE = 224
def resize(img_dcm):
return cv2.resize(np.array(img_dcm.pixel_array, (IMG_PX_SIZE,IMG_PX_SIZE)))
这是我读取 dcm 文件并将其传递给函数的方式:
img = pydi.dcmread(PATH)
image = resize(img)
我预计它会输出 224*224 大小的图像。但我收到以下错误:
<ipython-input-66-3cf283042491> in resize(img_dcm)
1 IMG_PX_SIZE = 224
2 def resize(img_dcm):
----> 3 return cv2.resize(np.array(image.pixel_array, (IMG_PX_SIZE,IMG_PX_SIZE)))
TypeError: data type not understood
这是使用 Scikit-Image 调整图像大小的替代方法:
In [105]: from pydicom.data import get_testdata_files
# read a sample image
In [106]: filename = get_testdata_files('MR_small.dcm')[0]
...: ds = pydicom.dcmread(filename)
In [107]: data = ds.pixel_array
In [108]: type(data)
Out[108]: numpy.ndarray
In [109]: data.shape
Out[109]: (64, 64)
In [111]: from skimage.transform import resize
In [114]: IMG_PX_SIZE = 32
# resize to new size
In [115]: resized_img = resize(data, (IMG_PX_SIZE, IMG_PX_SIZE), anti_aliasing=True)
In [116]: resized_img.shape
Out[116]: (32, 32)
DICOM 在 OpenCV 中不受支持,请参阅 here。在使用 OpenCV 调整它们的大小之前,您必须将所有图像转换为合适的格式(例如 jpg 或 png):
OpenCV does not support DICOM images so that you will have to find a
suitable libary (like http://dicom.offis.de/dcmtk.php.en ) and convert
the loaded image to a cv::Mat.
然后您可能还想使用不同的库来调整大小,这可能不值得:
- 将图像转换为 OpenCV 可读格式
- 使用 OpenCV 调整它们的大小
- 将它们转换回 DICOM
我建议您查看专门设计用于处理 DICOM 图像的库或工具。
您可以使用 here
中的此功能
您需要先阅读 dicom/Niftii 文件
def read_nifti_file(filepath):
"""Read and load volume"""
# Read file
scan = nib.load(filepath)
# Get raw data
scan = scan.get_fdata()
return scan
然后您可以调整音量大小:
def resize_volume(img):
"""Resize across z-axis"""
# Set the desired depth
desired_depth = 64
desired_width = 128
desired_height = 128
# Get current depth
current_depth = img.shape[-1]
current_width = img.shape[0]
current_height = img.shape[1]
# Compute depth factor
depth = current_depth / desired_depth
width = current_width / desired_width
height = current_height / desired_height
depth_factor = 1 / depth
width_factor = 1 / width
height_factor = 1 / height
# Resize across z-axis
img = ndimage.zoom(img, (width_factor, height_factor, depth_factor), order=1)
return img
我正在尝试将不同尺寸的 DICOM 图像调整为通用尺寸大小以训练我的神经网络。我认为 cv2 可以解决我的问题。但是我在我的 jupyter notebook
中得到了一个 'datatype not understood error'我正在尝试创建一个可以预测图像 class 的张量流神经网络。因此,我需要用于第一层训练的通用尺寸的图像
这是我创建的函数:
IMG_PX_SIZE = 224
def resize(img_dcm):
return cv2.resize(np.array(img_dcm.pixel_array, (IMG_PX_SIZE,IMG_PX_SIZE)))
这是我读取 dcm 文件并将其传递给函数的方式:
img = pydi.dcmread(PATH)
image = resize(img)
我预计它会输出 224*224 大小的图像。但我收到以下错误:
<ipython-input-66-3cf283042491> in resize(img_dcm)
1 IMG_PX_SIZE = 224
2 def resize(img_dcm):
----> 3 return cv2.resize(np.array(image.pixel_array, (IMG_PX_SIZE,IMG_PX_SIZE)))
TypeError: data type not understood
这是使用 Scikit-Image 调整图像大小的替代方法:
In [105]: from pydicom.data import get_testdata_files
# read a sample image
In [106]: filename = get_testdata_files('MR_small.dcm')[0]
...: ds = pydicom.dcmread(filename)
In [107]: data = ds.pixel_array
In [108]: type(data)
Out[108]: numpy.ndarray
In [109]: data.shape
Out[109]: (64, 64)
In [111]: from skimage.transform import resize
In [114]: IMG_PX_SIZE = 32
# resize to new size
In [115]: resized_img = resize(data, (IMG_PX_SIZE, IMG_PX_SIZE), anti_aliasing=True)
In [116]: resized_img.shape
Out[116]: (32, 32)
DICOM 在 OpenCV 中不受支持,请参阅 here。在使用 OpenCV 调整它们的大小之前,您必须将所有图像转换为合适的格式(例如 jpg 或 png):
OpenCV does not support DICOM images so that you will have to find a suitable libary (like http://dicom.offis.de/dcmtk.php.en ) and convert the loaded image to a cv::Mat.
然后您可能还想使用不同的库来调整大小,这可能不值得:
- 将图像转换为 OpenCV 可读格式
- 使用 OpenCV 调整它们的大小
- 将它们转换回 DICOM
我建议您查看专门设计用于处理 DICOM 图像的库或工具。
您可以使用 here
中的此功能您需要先阅读 dicom/Niftii 文件
def read_nifti_file(filepath):
"""Read and load volume"""
# Read file
scan = nib.load(filepath)
# Get raw data
scan = scan.get_fdata()
return scan
然后您可以调整音量大小:
def resize_volume(img):
"""Resize across z-axis"""
# Set the desired depth
desired_depth = 64
desired_width = 128
desired_height = 128
# Get current depth
current_depth = img.shape[-1]
current_width = img.shape[0]
current_height = img.shape[1]
# Compute depth factor
depth = current_depth / desired_depth
width = current_width / desired_width
height = current_height / desired_height
depth_factor = 1 / depth
width_factor = 1 / width
height_factor = 1 / height
# Resize across z-axis
img = ndimage.zoom(img, (width_factor, height_factor, depth_factor), order=1)
return img