日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

使用Python對Dicom文件進行讀取與寫入的實現

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

Pydicom

單張影像的讀取

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

import osimport pydicom# 調用本地的 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)

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

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.

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

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

但后續還會碰到:

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

在網上檢索后發現,可以通過設置TransferSyntaxUID來解決問題:

ds.file_meta.TransferSyntaxUID = pydicom.uid.ImplicitVRLittleEndian

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

一些簡單處理

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

讀取并編輯Dicom Tags

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

使用的Tag的Description

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

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

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

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

借助Numpy與PIL.Image

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

借助Numpy

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

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

借助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)))

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

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

只需要指定參數就可以解決了

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

可視化

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

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

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

效果如圖所示:

使用Python對Dicom文件進行讀取與寫入的實現

但真實的圖像是:

使用Python對Dicom文件進行讀取與寫入的實現

顯然顏色是有區別的.導致這種差別的原因是pyplot函數使用的cm也就是'color map' 是簡單的'bone' 并不能滿足醫學圖像的要求.

借助Image模塊

data_img.show()

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

使用Python對Dicom文件進行讀取與寫入的實現

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

單張影像的寫入

經過上面對Tag值的修改, 對圖像的切割, 旋轉等操作.最后需要重新寫入該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++的操作風格,需要先初始化一個對象,然后設置一些參數,最后返回image.相對更復雜,但可以操作的點比較多

file_reader = sitk.ImageFileReader()file_reader.SetFileName(file_path) #這里只顯示了必需的,還有很多可以設置的參數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)

序列讀取

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

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() 轉換. 之后可以再轉換回原格式.

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結合使用常見的問題

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

使用Python對Dicom文件進行讀取與寫入的實現

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

使用Python對Dicom文件進行讀取與寫入的實現

可見,SimpleITK的可視化要比上面介紹的強大很多,不僅可以實現單張圖像的可視化以及圖像處理,還可以同時對整個序列的圖像進行統一處理.

單張影像的寫入

同樣有兩種方法

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)

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

到此這篇關于使用Python對Dicom文件進行讀取與寫入的實現的文章就介紹到這了,更多相關Python Dicom文件進行讀取與寫入內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品资源| 在线手机中文字幕| 免费高潮视频95在线观看网站| 国产精品日韩精品在线播放| 日本不卡视频一二三区| 日韩欧美精品一区二区综合视频| 日本vs亚洲vs韩国一区三区二区| 日韩国产欧美三级| 麻豆精品蜜桃视频网站| 91亚洲国产高清| 国户精品久久久久久久久久久不卡 | 国产日韩欧美一区二区三区| 亚洲一区二区三区四区电影| 91伊人久久| 激情国产在线| 欧美精品九九| 欧美精品国产| 久久久水蜜桃av免费网站| 久热精品在线| 九九99久久精品在免费线bt| 久久精品国内一区二区三区水蜜桃| 欧美特黄一区| 国产精品亚洲欧美| 久久中文字幕二区| 欧美一区激情| 亚洲福利国产| 国产日韩亚洲| 欧洲av一区二区| 日欧美一区二区| 精品亚洲免a| 亚洲一级大片| 欧美亚洲国产激情| 麻豆精品一区二区综合av| 午夜在线精品| 亚洲www免费| 97精品国产99久久久久久免费| 深夜福利视频一区二区| 一区二区高清| 另类中文字幕国产精品| 91精品丝袜国产高跟在线| 香蕉精品视频在线观看| 人人草在线视频| 日本不卡视频在线| 尤物精品在线| 久久在线免费| 色婷婷久久久| 高清日韩中文字幕| 日韩欧美激情电影| 亚洲开心激情| 美国欧美日韩国产在线播放| 亚洲国产一区二区在线观看| 日本高清不卡一区二区三区视频| 国产精品扒开腿做爽爽爽软件| 亚洲中午字幕| 国产一区白浆| 日韩午夜高潮| 亚洲高清影视| 91精品xxx在线观看| 久久免费影院| 久久精品国产网站| 美女免费视频一区| 日本欧美一区二区在线观看| 欧美在线综合| 欧美午夜不卡影院在线观看完整版免费| 亚洲欧洲高清| 日韩毛片视频| 桃色av一区二区| 日韩精品久久久久久久电影99爱| 久久黄色影院| 六月婷婷一区| 日韩精品国产欧美| 国产精品蜜月aⅴ在线| 日韩三级一区| 国产精品亚洲综合在线观看| 精品久久网站| 不卡中文一二三区| 亚洲五月综合| 免费一级欧美片在线观看网站| 国产一区二区三区黄网站| 久久精品亚洲人成影院| 在线视频精品| 91亚洲精品视频在线观看| 国产一区国产二区国产三区| 国内精品福利| 欧美亚洲一区二区三区| 欧美经典一区| 不卡中文字幕| 视频一区中文字幕精品| 精品成人18| 日韩中文字幕亚洲一区二区va在线 | 久久精品一区二区不卡| 亚洲精品四区| 精品欧美视频| 免费的成人av| 中文字幕在线视频久| 石原莉奈在线亚洲二区| 另类欧美日韩国产在线| 中文欧美日韩| 国产精品黑丝在线播放| 日韩精品亚洲aⅴ在线影院| 成人福利视频| 91精品一区| 欧美在线资源| 天堂а√在线最新版中文在线| 欧美精品三级在线| 亚洲中午字幕| 久久精品播放| 欧美日韩视频网站| 国产suv精品一区| 国产精品一区二区三区美女| 麻豆成人在线| 伊人影院久久| 亚洲国产不卡| 好看的av在线不卡观看| 欧美三级精品| 高清久久精品| 久久99免费视频| 国产乱码精品一区二区三区亚洲人 | 国产精品男女| 婷婷亚洲成人| 久久久久久美女精品| 精品一区视频| 国产日本精品| 久久精品一区二区三区中文字幕| 日韩在线黄色| 亚洲97av| 亚洲精品乱码| 一区二区三区网站| 亚洲精品三级| 日韩高清三区| 国产精品密蕾丝视频下载| 国产精品对白| 国产中文字幕一区二区三区| 日韩毛片视频| 中文在线一区| 亚洲永久精品唐人导航网址| 一区二区三区午夜视频| 91大神在线观看线路一区| 国产精品亲子伦av一区二区三区 | 丝袜亚洲另类欧美| 日韩中文字幕区一区有砖一区 | 波多视频一区| 日韩午夜黄色| 天堂va在线高清一区| 欧美一级二级三级视频| 美女在线视频一区| 久久免费高清| 中文字幕亚洲影视| 捆绑调教美女网站视频一区| 91精品啪在线观看国产18| 国产精品人人爽人人做我的可爱| 亚洲精品麻豆| 91av亚洲| 亚洲乱码视频| 日韩中文在线电影| 久久亚洲国产精品一区二区| 国产精品一线| 欧美日韩四区| 久久精品国产999大香线蕉| 日韩免费福利视频| 日韩精品国产欧美| 国产99精品| 国产精品成人3p一区二区三区| 一区二区三区视频免费观看| 日韩在线观看中文字幕| 久久狠狠婷婷| 精品淫伦v久久水蜜桃| 丝瓜av网站精品一区二区| 成人亚洲一区二区| 日韩欧美另类中文字幕| 成人看片网站| 国产精品v日韩精品v欧美精品网站| 欧美中文字幕一区二区| 国产伦精品一区二区三区视频 | 亚洲伊人影院| 欧美日韩精品一区二区视频| 91精品国产自产观看在线| 激情91久久| 99国产精品免费视频观看| 精品理论电影在线| 欧美日韩一区二区三区在线电影| 伊人久久大香线蕉av超碰演员| 美女久久久精品| 日韩一区中文| 亚洲三级网址| 亚洲天堂日韩在线| 久久大逼视频| 欧美特黄一区| 五月天久久久| 超级白嫩亚洲国产第一| 久久国内精品视频| 日韩国产一区二| 日韩二区在线观看| 亚洲精品系列| 亚洲区欧美区| 免费在线观看视频一区| 亚洲小说欧美另类婷婷| 97精品国产| 人在线成免费视频| 日韩在线综合|