简体   繁体   English

在 python 中调整 DICOM 图像的大小

[英]Resize a DICOM image in python

I am trying to resize DICOM images of different dimensions into a common dimension size for training my neural.network.我正在尝试将不同尺寸的 DICOM 图像调整为通用尺寸大小以训练我的神经网络。 I thought that cv2 could solve my problem.我认为 cv2 可以解决我的问题。 But I am getting a 'datatype not understood error' in my jupyter notebook但是我的 jupyter notebook 中出现“数据类型不理解错误”

I am trying to create a tensorflow neural.network that could predict the class of the image.我正在尝试创建一个 tensorflow 神经网络,它可以预测图像的 class。 Thus, I need images of a common dimension size for the first layer training因此,我需要用于第一层训练的通用尺寸的图像

Here is the function I have created:这是我创建的 function:

IMG_PX_SIZE = 224
def resize(img_dcm):
    return cv2.resize(np.array(img_dcm.pixel_array, (IMG_PX_SIZE,IMG_PX_SIZE)))

This is how I read the dcm files and pass it to the function:这就是我读取 dcm 文件并将其传递给 function 的方式:

img = pydi.dcmread(PATH)
image = resize(img)

I expected it to output a 224*224 sized image.我希望它是 output 一个 224*224 大小的图像。 But I am getting the following error:但我收到以下错误:

<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

Here's an alternative way to resize the images using Scikit-Image:这是使用 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 is not supported in OpenCV, see here . OpenCV 不支持DICOM ,请参见此处 You will have to convert all of your images into a suitable format (eg jpg or png) before you are able to resize them with OpenCV:您必须先将所有图像转换为合适的格式(例如 jpg 或 png),然后才能使用 OpenCV 调整它们的大小:

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 不支持 DICOM 图像,因此您必须找到合适的库(如http://dicom.offis.de/dcmtk.php.en )并将加载的图像转换为 cv::Mat。

Then again you may want to use a different library for re-sizing as well, it is probably not worth the effort to:再说一次,您可能还想使用不同的库来调整大小,这样做可能不值得:

  1. Convert the images to a readable format for OpenCV将图像转换为 OpenCV 的可读格式
  2. Re-size them with OpenCV使用 OpenCV 重新调整它们的大小
  3. Convert them back to DICOM将它们转换回DICOM

I'd recommend you instead look into a library or tool specifically designed to work with DICOM images.我建议您转而查看专门设计用于处理 DICOM 图像的库或工具。

You can use this functions from here您可以从这里使用此功能

You need to first read your dicom/Niftii files你需要先阅读你的 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

then you can resize your volume:然后你可以调整你的音量:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM