日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

医学影像中用 python 读取 nrrd 文件、nrrd转nii、nrrd转h5

發布時間:2024/10/8 python 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 医学影像中用 python 读取 nrrd 文件、nrrd转nii、nrrd转h5 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.



用 python 讀取 nrrd 文件一般使用 pynrrd 這個庫

1 安裝pynrrd

pip 安裝

pip install pynrrd

源碼安裝

pip install git+https://github.com/mhe/pynrrd.git cd pynrrd pip install . // 注意不要忘了最后的小點

2 讀取 nrrd 文件

//先導入 nrrd 庫 import nrrd data_path=r'你自己的 nrrd 文件路徑’ data,options=nrrd.read(data_path) # 讀入 nrrd 文件 ''' data:保存圖片的多維矩陣; nrrd_options:保存圖片的相關信息 ''' 可以打印查看data 和 nrrd_options 里面的內容: print(data) print(options)

OrderedDict([('type', 'unsigned char'), ('dimension', 3), ('space', 'left-posterior-superior'), ('sizes', array([640, 640, 88])), ('space directions', array([[1., 0., 0.],[0., 1., 0.],[0., 0., 1.]])), ('kinds', ['domain', 'domain', 'domain']), ('encoding', 'raw'), ('space origin', array([0., 0., 0.]))])

3 查看 nrrd 文件的形狀

# 查看nrrd文件的形狀 print(data.shape) # (640, 640, 88)

正常情況下讀取出來的 nrrd 數據應該都是類似這種的格式:[w, h, n]第三維度保存的是圖像的序號;

但是在一些情況先我們讀出來的數據格式是:[c, w, h, n] ;這乍一看沒啥為題,就是多了第一維度的通道信息。

4 將 nrrd 矩陣轉換為圖像數據

4.1 數據格式為[w, h, n]

import nrrd import PIL from PIL import Imagedata_path = './data/laendo.nrrd' data, options = nrrd.read(data_path) # 讀入nrrd文件 ''' data:保存圖片的多維矩陣 nrrd_options:保存圖片的相關信息 ''' print(data) print(options) # 查看nrrd文件的形狀 print(data.shape)img = Image.fromarray(data[:, :, 50]) temp_path = './data/temp_img.png' img.convert('RGB').save(temp_path)

4.2 數據格式為[c, w, h, n]

我的 nrrd 文件轉成圖像后是用于深度學習,
data.shape = (3, 512, 512, 237)
所以就先將其轉換為PIL 格式(需要用到PIL庫)

import PIL # 測試PIL庫是否安裝成功from PIL import Image img=Image.fromarray(data[:,:,20]) # 截取第20張圖片

究其原因,是因為[c, w, h, n]中,c的原因;如果要想成功的將其轉換為圖像數據,可以使用下面這條命令

img=Image.fromarray(data[1,:,:,20]) # 截取第一個通道的第20張圖片

但是我經過對比,發現三個通道上的信息不同,如果隨意選擇一個進行提取,那么就會丟失另外兩個通道的信息。后面我問其他人,他們說第一個維度上的數值還有為 2 的,瞬間就給我整懵了。
后來經過查詢以及對三個通道的圖像對比,懷疑第一維度上面的信息可能表示 患者接受掃描的期相,1 表示平掃,只有一期;2 表示增強,有動脈期和靜脈期;3 表示造影,有動脈期、靜脈期和平衡期。
同時從掃描角度考慮,在這幾個掃描期相中,患者的位置是相對固定的,也就是說我們可以隨意選擇其中一個期相都可以;但是反過來,我們可以將所有期相的數據都利用上。
如果只是想隨意選擇其中的一個期相,使用上面一個命令即可,如果想將所有的期相都用起來,那么需要增加一個循環。

for j in range(img.shape[0]):for i in range(img.shape[3]):img=Image.fromarray(data[j,:,:,i]) # 截取第j個通道的前i張圖 //循環結束后,就可以將所有數據都提取出來并直接轉換為圖片數據 //最后貼一個相對比較完整的代碼 import PIL import nrrd import osdata_path=./data/PA1.nrrd # nrrd 文件的保存路徑 save_path=./data/save # 圖片數據的保存文件夾# 檢查路徑 assert os.path.exists(data_path), data_path+' : path error !' if not os.paht.exists(save_path):os.makedir(save_path)data, options = nrrd.read(data_path) for j in range(data.shape[0]):for i in range(data.shape[3]):img=Image.fromarray(data[j,:,:,i]) # 截取第j個通道的前i張圖temp_path=save_path + '/' + str(j) + '_' + str(i) +'.png'img.convert('RGB').save(tmp_path) # 保存圖像數據 //循環結束后,就可以將所有數據都提取出來并直接轉換為圖片數據

5 nrrd轉nii

import nrrd import nibabel as nib import numpy as np# nrrd 文件保存路徑 data_path=r'./data/1.nrrd' save_path='./data/1.nii'data,options=nrrd.read(data_path) # 讀取 nrrd 文件 img=nib.Nifti1Image(data,np.eye(4)) # 將 nrrd 文件轉換為 .nii 文件 nib.save(img,save_path) # 保存 nii 文件

6 nrrd轉h5

  • Download heart MRI data MICCAI 2018 Atrial Segmentation Challenge.
  • Pre-processing data like existing work UA-MT
import numpy as np from glob import glob from tqdm import tqdm import h5py import nrrdoutput_size = [112, 112, 80]def covert_h5():listt = glob('../../LA_dataset/2018LA_Seg_Training Set/*/lgemri.nrrd')for item in tqdm(listt):image, img_header = nrrd.read(item)label, gt_header = nrrd.read(item.replace('lgemri.nrrd', 'laendo.nrrd'))label = (label == 255).astype(np.uint8)w, h, d = label.shapetempL = np.nonzero(label)minx, maxx = np.min(tempL[0]), np.max(tempL[0])miny, maxy = np.min(tempL[1]), np.max(tempL[1])minz, maxz = np.min(tempL[2]), np.max(tempL[2])px = max(output_size[0] - (maxx - minx), 0) // 2py = max(output_size[1] - (maxy - miny), 0) // 2pz = max(output_size[2] - (maxz - minz), 0) // 2minx = max(minx - np.random.randint(10, 20) - px, 0)maxx = min(maxx + np.random.randint(10, 20) + px, w)miny = max(miny - np.random.randint(10, 20) - py, 0)maxy = min(maxy + np.random.randint(10, 20) + py, h)minz = max(minz - np.random.randint(5, 10) - pz, 0)maxz = min(maxz + np.random.randint(5, 10) + pz, d)image = (image - np.mean(image)) / np.std(image)image = image.astype(np.float32)image = image[minx:maxx, miny:maxy]label = label[minx:maxx, miny:maxy]print(label.shape)f = h5py.File(item.replace('lgemri.nrrd', 'mri_norm2.h5'), 'w')f.create_dataset('image', data=image, compression="gzip")f.create_dataset('label', data=label, compression="gzip")f.close()if __name__ == '__main__':covert_h5()

總結

以上是生活随笔為你收集整理的医学影像中用 python 读取 nrrd 文件、nrrd转nii、nrrd转h5的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。