成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

使用Python對Dicom文件進(jìn)行讀取與寫入的實現(xiàn)

瀏覽:114日期:2022-07-29 14:03:39

Pydicom

單張影像的讀取

使用 pydicom.dcmread() 函數(shù)進(jìn)行單張影像的讀取,返回一個pydicom.dataset.FileDataset對象.

import osimport pydicom# 調(diào)用本地的 dicom file folder_path = r'D:FilesDataMaterials'file_name = 'PA1_0001.dcm'file_path = os.path.join(folder_path,file_name)ds = pydicom.dcmread(file_path)

在一些特殊情況下,比如直接讀取從醫(yī)院拿到的數(shù)據(jù)(未經(jīng)任何處理)時,可能會發(fā)生以下報錯:

raise InvalidDicomError('File is missing DICOM File Meta Information 'pydicom.errors.InvalidDicomError: File is missing DICOM File Meta Information header or the ’DICM’ prefix is missing from the header. Use force=True to force reading.

可以看到,由于缺失文件元信息頭,無法直接讀取,只能強(qiáng)行讀取.這種情況可以直接根據(jù)提示,調(diào)整命令為:

ds = pydicom.dcmread(file_path,force=True)

但后續(xù)還會碰到:

AttributeError: ’Dataset’ object has no attribute ’TransferSyntaxUID’

在網(wǎng)上檢索后發(fā)現(xiàn),可以通過設(shè)置TransferSyntaxUID來解決問題:

ds.file_meta.TransferSyntaxUID = pydicom.uid.ImplicitVRLittleEndian

這樣就大功告成了(這里實際上就提前接觸到了下面讀取Dicom Tags的內(nèi)容了)

一些簡單處理

讀取成功后,我們可以對 Dicom文件 進(jìn)行一些簡單的處理

讀取并編輯Dicom Tags

可以通過兩種方法來讀取Tag的值

使用的Tag的Description

print(ds.PatientID,ds.StudyDate,ds.Modality)

使用 ds.get() 函數(shù). 函數(shù)內(nèi)參數(shù)采用的是Tag ID.幾種簡單的打開Dicom文件的軟件(如RadiAnt DICOM Viewer)都可以直接看到.這里不再贅述.

ds.get(0x00100020) # 這里得到的是PatientID

讀取到相應(yīng)的Tag值后, 也可以將其他的值寫入這些Tag.只要最后保存一下就可以了.

借助Numpy與PIL.Image

讀取Dicom文件后,可以借助Numpy以及圖像處理庫(如PIL.Image)來進(jìn)行簡單的處理.

借助Numpy

import numpy as npdata = np.array(ds.pixel_array)

注意這里使用的是 np.array() 而不是 np.asarray(). 因為前者的更改并不會帶來原pixel_array的改變.在轉(zhuǎn)化為ndarray后 可以直接進(jìn)行簡單的切割和連接,比如截取某一部分和將兩張圖像拼在一起等,之后再寫入并保存下來即可.

借助PIL.Image

from PIL import Imagedata_img = Image.fromarray(ds.pixel_array)data_img_rotated = data_img.rotate(angle=45,resample=Image.BICUBIC,fillcolor=data_img.getpixel((0,0)))

這里展示的是旋轉(zhuǎn), 還有其他功能如resize等.需要注意的是,從Numpy的ndarray轉(zhuǎn)化為Image時,一般會發(fā)生變化:

print(data.dtype) # int16data_rotated = np.array(data_img_rotated)print(data_img) # int32

只需要指定參數(shù)就可以解決了

data_rotated = np.array(data_img_rotated,dtype = np.int16)

可視化

簡單的可視化Pydicom沒有直接的實現(xiàn)方法,我們可以通過上面借助Matplotlib以及Image模塊來實現(xiàn).但效果有限.

借助 Matplotlib (Pydicom官方文檔中使用的方法)

from matplotlib import pyplotpyplot.imshow(ds.pixel_array,cmap=pyplot.cm.bone)pyplot.show()

效果如圖所示:

使用Python對Dicom文件進(jìn)行讀取與寫入的實現(xiàn)

但真實的圖像是:

使用Python對Dicom文件進(jìn)行讀取與寫入的實現(xiàn)

顯然顏色是有區(qū)別的.導(dǎo)致這種差別的原因是pyplot函數(shù)使用的cm也就是'color map' 是簡單的'bone' 并不能滿足醫(yī)學(xué)圖像的要求.

借助Image模塊

data_img.show()

一條指令即可,但是效果很差,如圖所示:

使用Python對Dicom文件進(jìn)行讀取與寫入的實現(xiàn)

綜合來看,兩種方法都不是很好.

單張影像的寫入

經(jīng)過上面對Tag值的修改, 對圖像的切割, 旋轉(zhuǎn)等操作.最后需要重新寫入該Dicom文件.

ds.PixelData = data_rotated.tobytes()ds.Rows,ds.Columns = data_rotated.shapenew_name = 'dicom_rotated.dcm'ds.save_as(os.path.join(folder_path,new_name))

SimpleITK

SimpleITK 是從基于C++的ITK遷移到Python的,所以很多方法的使用都跟C++很相似.

import SimpleITK as sitk

單張影像的讀取

有兩種方法:

sitk.ReadImage()這種方法直接返回image對象,簡單易懂.但是無法讀取Tag的值.

img = sitk.ReadImage(file_path)print(type(img)) # <class ’SimpleITK.SimpleITK.Image’>

sitk.ImageFileReader()這種方法比較像C++的操作風(fēng)格,需要先初始化一個對象,然后設(shè)置一些參數(shù),最后返回image.相對更復(fù)雜,但可以操作的點比較多

file_reader = sitk.ImageFileReader()file_reader.SetFileName(file_path) #這里只顯示了必需的,還有很多可以設(shè)置的參數(shù)data = file_reader.Execute()# 使用這種方法讀取Dicom的Tag Valuefor key in file_reader.GetMetaDataKeys(): print(key,file_reader.GetMetaData(key))

以上兩種方法返回的都是三維的對象,這與Pydicom有很大的不同.

data_np = sitk.GetArrayFromImage(data)print(data_np.shape) # (1, 512, 512) = (Slice index, Rows, Columns)

序列讀取

序列讀取的方法與單張圖像讀取的第二種方法很相似.(暫且只發(fā)現(xiàn)了一種方法讀取序列,如果還有其他方法,請在評論區(qū)予以補(bǔ)充,感謝!)

series_reader = sitk.ImageSeriesReader()fileNames = series_reader.GetGDCMSeriesFileNames(folder_name)series_reader.SetFileNames(fileNames)images = series_reader.Execute()

同樣,返回的也是三維的對象.

一些簡單操作

SimpleITK 包含很多圖像處理如濾波的工具,這里簡單介紹一個邊緣檢測工具和可視化工具

邊緣檢測

以Canny邊緣檢測算子為例,與讀取單張圖像類似,同樣有兩種方式:

sitk.CannyEdgeDetection()由于濾波的對象必須是32位圖像或者其他格式, 需要通過 sitk.Cast() 轉(zhuǎn)換. 之后可以再轉(zhuǎn)換回原格式.

data_32 = sitk.Cast(data,sitk.sitkFloat32)data_edge_1 = sitk.CannyEdgeDetection(data_32,5,30,[5]*3,[0.8]*3)

sitk.CannyEdgeDetectionImageFilter()這個操作相對麻煩一些

Canny = sitk.CannyEdgeDetectionImageFilter()Canny.SetLowerThreshold(5)Canny.SetUpperThreshold(30)Canny.SetVariance([5]*3)Canny.SetMaximumError([0.5]*3)data_edge_2 = Canny.Execute(data_32)

可視化

可視化的方法非常簡單 只需要一條指令:

sitk.Show()

但需要先安裝工具ImageJ,否則無法使用.具體的安裝鏈接,可以參考這篇博文:sitk.show()與imageJ結(jié)合使用常見的問題

同一張Dicom文件使用sitk.Show()得到的效果如下圖:

使用Python對Dicom文件進(jìn)行讀取與寫入的實現(xiàn)

除此之外,ImageJ還有一個Tool Bar 支持對圖像的進(jìn)一步處理:

使用Python對Dicom文件進(jìn)行讀取與寫入的實現(xiàn)

可見,SimpleITK的可視化要比上面介紹的強(qiáng)大很多,不僅可以實現(xiàn)單張圖像的可視化以及圖像處理,還可以同時對整個序列的圖像進(jìn)行統(tǒng)一處理.

單張影像的寫入

同樣有兩種方法

sitk.WriteImage()

new_name = 'new_MR_2.dcm'sitk.WriteImage(img,os.path.join(folder_name,new_name))

sitk.ImageFileWriter()

file_writer = sitk.ImageFileWriter()file_writer.SetFileName(os.path.join(folder_name,new_name))file_writer.SetImageIO(imageio='GDCMImageIO')file_writer.Execute(img)

使用這兩種方法進(jìn)行寫入的時候,會發(fā)現(xiàn),即便什么也沒有做,但得到的新Dicom文件要小于原始的Dicom文件.這是因為新的Dicom文件中沒有Private Creator信息(屬于Dicom Tag的內(nèi)容).當(dāng)然如果原始Dicom文件中本就沒有這種信息,文件大小是保持相同的.因為很多時候只是對圖像進(jìn)行處理,所以不再深究.

到此這篇關(guān)于使用Python對Dicom文件進(jìn)行讀取與寫入的實現(xiàn)的文章就介紹到這了,更多相關(guān)Python Dicom文件進(jìn)行讀取與寫入內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Python 編程
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
在线观看欧美黄色| 亚洲日本无吗高清不卡| 影音欧美亚洲| 久久久精品蜜桃| 国产成人免费视频| 欧美在线观看一二区| 亚洲成av人片在线| 国产一区二区三区久久| 亚洲欧美一区二区三区久本道91| 国产一区二区中文| 中文乱码免费一区二区| 欧美精品啪啪| 日本一区二区电影| 欧美日韩天天操| 国产精品久久久久久妇女6080 | 国产精品久久99| 欧美日本亚洲| 成人欧美一区二区三区小说| 不卡的av在线| 精品国产1区二区| 91伊人久久大香线蕉| 久久久九九九九| 欧美日韩精品免费观看视一区二区 | 56国语精品自产拍在线观看| 久久精品国产一区二区三| 欧美色精品在线视频| 久久精品国产精品亚洲综合| 欧美人与禽zozo性伦| 高清视频一区二区| 久久久久高清精品| 欧美在线免费一级片| 国产精品久久影院| 亚洲成人中文| 午夜视频一区二区三区| 一本一道综合狠狠老| 麻豆一区二区在线| 欧美一区二区播放| 99国产精品视频免费观看| 国产日韩欧美一区二区三区乱码| 亚洲国产电影| 亚洲午夜视频在线| 一本色道久久综合精品竹菊| 精品制服美女久久| 精品国产乱子伦一区| 黄色免费成人| 五月天激情综合网| 欧美三区在线观看| 99re热视频这里只精品| 亚洲免费在线电影| 欧美主播一区二区三区| 成人网在线免费视频| 国产精品久久久久久户外露出| 国产伦精品一区二区三区视频黑人| 蜜桃av一区二区| 精品精品欲导航| 在线成人国产| 蜜臀av性久久久久蜜臀aⅴ流畅 | 国产一区二区三区精品欧美日韩一区二区三区 | 久久综合综合久久综合| 欧美电视剧免费全集观看| 欧美日韩免费高清| 亚洲一区二区三区国产| 欧美日韩免费一区二区三区视频| 99久久精品99国产精品| 亚洲嫩草精品久久| 欧美日韩美少妇| 欧美激情91| 亚洲成人综合视频| 欧美电影免费观看高清完整版在 | 国产成人在线网站| 中文字幕亚洲不卡| 欧美无砖专区一中文字| 欧美日韩国产成人精品| 亚洲成av人片一区二区| 日韩三级伦理片妻子的秘密按摩| 亚洲视频观看| 美女视频黄频大全不卡视频在线播放| 久久免费精品国产久精品久久久久| 亚洲人成久久| 黄一区二区三区| 国产精品传媒在线| 欧美日韩精品一区二区在线播放 | 欧美刺激午夜性久久久久久久| 亚洲电影专区| 久久不见久久见中文字幕免费| 欧美国产精品一区二区| 欧美亚洲一区三区| 欧美韩日精品| 免费高清成人在线| 中文字幕精品三区| 在线免费观看一区| 国产精品www.| 韩国一区二区视频| 亚洲男同性视频| 欧美xxxxxxxx| 久久精品国产综合精品| 亚洲综合欧美| 日本一区二区三级电影在线观看| 97se亚洲国产综合自在线观| 亚洲一区二区三区在线播放 | 久久久久久久网| 国产精品久久久久9999高清| 国产又粗又猛又爽又黄91精品| 国产精品伦理一区二区| 欧美日韩不卡在线| 国产美女精品| 91女厕偷拍女厕偷拍高清| 日韩成人伦理电影在线观看| 欧美国产精品一区二区| 欧美美女一区二区| 成人性色生活片免费看爆迷你毛片| 亚洲图片欧美色图| 国产偷国产偷精品高清尤物| 欧美三级日本三级少妇99| 日韩午夜av在线| 不卡av电影在线播放| 天天影视网天天综合色在线播放| 久久综合九色综合97婷婷| 色悠久久久久综合欧美99| 国产精品xxx在线观看www| 国产九色sp调教91| 日韩中文字幕av电影| 国产精品高潮久久久久无| 欧美一卡二卡在线| 91精彩视频在线观看| 亚洲福利国产| 成人激情av网| 黑人巨大精品欧美一区| 亚洲成人精品在线观看| 国产精品久久久久久久久久免费看| 欧美一区二区久久久| 久久国产一区| 99精品99| 欧美日韩伊人| 99在线精品视频| 精品在线播放免费| 香蕉乱码成人久久天堂爱免费| 亚洲欧洲成人自拍| 国产亚洲一区二区三区| 欧美日韩精品一区二区| 先锋影音国产精品| 国内精品一区二区| av电影在线观看一区| 国产真实精品久久二三区| 热久久国产精品| 亚洲国产成人va在线观看天堂| 久久精品亚洲国产奇米99| 日韩三级免费观看| 欧美日韩www| 老妇喷水一区二区三区| 精品1区2区| 欧美精品色网| 91色在线porny| 成人动漫av在线| 成人h版在线观看| 成人丝袜18视频在线观看| 国产一区二区三区电影在线观看| 日韩高清电影一区| 午夜av一区二区| 亚洲国产视频直播| 亚洲综合无码一区二区| 亚洲精品日日夜夜| 国产精品国产三级国产普通话蜜臀 | 欧美日韩高清在线播放| 色一情一乱一乱一91av| 久久不射网站| 欧美中文日韩| 久久久久一区二区| 久久久99爱| 色婷婷久久综合| 久久久久国产精品一区三寸| 欧美亚洲三级| 久久免费国产| 久久亚洲欧洲| 91福利国产精品| 精品视频免费在线| 欧美丰满少妇xxxxx高潮对白| 欧美猛男gaygay网站| 欧美日韩国产美| 欧美一级片免费看| 亚洲精品在线观看视频| 久久网站热最新地址| 日本一区二区三区四区在线视频| 国产视频一区在线播放| 中文字幕第一区二区| 中文字幕一区在线| 亚洲黄色免费电影| 偷拍亚洲欧洲综合| 久久国产欧美日韩精品| 国产一区二区三区综合| 国产91精品露脸国语对白| 成人黄色777网| 欧美视频官网| 亚洲永久视频| 欧美午夜精品久久久久久超碰| 91 com成人网| 久久综合av免费| 国产精品全国免费观看高清| 亚洲人成精品久久久久| 亚洲高清视频中文字幕|