Используйте Python для чтения медицинских изображений общего формата (nii, dicom, mhd)

Идентификация изображения
Используйте Python для чтения медицинских изображений общего формата (nii, dicom, mhd)

Это 4-й день моего участия в ноябрьском испытании обновлений.Подробности о событии:Вызов последнего обновления 2021 г.

1. Преобразование необработанных медицинских изображений в формате mhd

Формат raw+mhd — это распространенный формат медицинских изображений.Данные каждого пациента включают в себя файл mhd и файл необработанных данных с тем же именем.Mhd — это данные метазаголовка, информация заголовка данных, а в необработанном виде хранится информация о пикселях. Библиотека SimpleITK, которую должен использовать метод, нам нужно установить соответствующую библиотеку в нашей собственной среде Python.

pip install SimpleITK

Данные mhd+raw часто представляют собой трехмерные объемные данные.Мы можем прочитать конкретную информацию о данных из файла mhd, такую ​​как размер изображения, размер среза, размер пикселя и другую информацию. использоватьsitk.ReadImage()прочитать изображение,Используйте sitk.GetArrayFromImage()Матрица изображения может быть получена. Конкретный код выглядит следующим образом:

import os
import SimpleITK as sitk
import matplotlib.pyplot as plt
from natsort import natsorted
from tqdm import tqdm
import cv2
import numpy as np

mhd_path = './xxx.mhd'  # mhd文件需和同名raw文件放在同一个文件夹
data = sitk.ReadImage(mhd_path)  # 读取mhd文件
# print(data)
spacing = data.GetSpacing()  # 获得spacing大小
img_data = sitk.GetArrayFromImage(data)  # 获得图像矩阵
print(img_data.shape)

# 图像数据转换为npy保存
np.save('img_data.npy', np.array(img_data))

# 将图像转为png格式保存
for i in range(img_data.shape[0]):
    cv2.imwrite('./{}.png'.format(i), img_data[i, :, :])

2. Преобразование данных медицинских изображений формата Dicom

DICOM (Цифровая визуализация и связь в медицине)Цифровая визуализация и передача данных в медицине — это международный стандарт медицинских изображений и связанной с ними информации (ISO 12052). DICOM широко используется в радиологии, визуализации сердечно-сосудистой системы и радиологическом диагностическом оборудовании (рентген, КТ, МРТ, УЗИ и т. д.), а также широко используется в других областях медицины, таких как офтальмология и стоматология. Все медицинские изображения пациентов хранятся в формате файлов DICOM. Чтение изображений dicom с помощью Python можно выполнить с помощью библиотеки pydicom и библиотеки SimpleITK. Поскольку в области обработки медицинских изображений необходимо экспортировать разные изображения с разной шириной окна и уровнями, в следующем коде я добавил соответствующий код.

pip install SimpleITK
pip install pydicom

Конкретный код для использования метода pydicom выглядит следующим образом:

import os
import SimpleITK as sitk
import matplotlib.pyplot as plt
from natsort import natsorted
from tqdm import tqdm
import cv2
import pydicom
import numpy as np

#调整图像窗宽窗位
def window_transform(ct_array, window_width, window_center, normal=False):
    min_window = float(window_center) - 0.5*float(window_width)
    new_img = (ct_array - min_window) / float(window_width)
    new_img[new_img < 0] = 0
    new_img[new_img > 1] = 1
    if not normal:
        new_img = (new_img * 255).astype('uint8')
    return new_img


img_path = 'xx.dcm'
#此时读取的是所有dicom图像信息
image = pydicom.read_file(img_path)
#获得图像矩阵
image_data = image.pixel_array
#获得dicom中的患者信息、图像信息等
information['PatientID'] = image.PatientID
information['PatientName'] = image.PatientName
information['PatientBirthDate'] = image.PatientBirthDate
information['PatientSex'] = image.PatientSex
window_width = 1000
window_center = 30
image_data = window_transform(image_data, window_width, window_center, normal=False)
cv2.imwrite('./img.png',image_data)

Конкретный код для использования метода SimpleITK выглядит следующим образом:

import os
import SimpleITK as sitk
import matplotlib.pyplot as plt
from natsort import natsorted
from tqdm import tqdm
import cv2
import pydicom
import numpy as np

img_path = 'xx.dcm'
#此时读取的是所有dicom图像信息
image = sitk.ReadImage(img_path)
# 转为值为0-255的灰度图
rescalFilt = sitk.RescaleIntensityImageFilter()
rescalFilt.SetOutputMaximum(255)
rescalFilt.SetOutputMinimum(0)
image = rescalFilt.Execute(image)
image_data = sitk.GetArrayFromImage(image_data)
image_data = np.squeeze(dicom_data)
cv2.imwrite('./img.png',image_data)

3. Преобразование медицинских изображений в формат Nii

На заре медицинской визуализации использовался стандарт DICOM.В основном все производители используют продукты, соответствующие стандарту DICOM, но этот стандарт не удобен для анализа данных. Различные стандарты хранения данных, такие как анализ, родились примерно во время появления нейровизуализации. Позже, чтобы облегчить академические обмены, NIH привлек экспертов из других организаций, чтобы создать рабочую группу для разработки нового стандарта хранения данных для нейровизуализации, названного NIFTI. Для чтения изображений формата NIFTI с суффиксом nii требуется установленная библиотека nibabel.

pip install nibabel

использоватьnib.load()Функция может считывать данные данных изображения, где dataobj — матрица изображения.

import os 
import numpy as np 
import nibabel as nib
import matplotlib.pyplot as plt
from glob import glob

img_path = './xxx.nii'
image = nib.load(img_path)    
image_data = image.dataobj
for i in range(0, dataobj.shape[2]): 
    cv2.imwrite('./{}.png'.format(i), img_data[i, :, :])