Python 處理醫學影像 - 以 SPECT 為例

2014-03-10 Kaohsiung.py

Python 處理醫學影像 - 以 SPECT 為例

Department of Nuclear Medicine, Kaohsiung Veterans General Hospital
Sin-di Lee

Background picture: Stamen / Map data: OSM and its contributors

李昕迪 / mcdlee

Outline

版權聲明

核子醫學是什麼?

今天的重點是影像

Nuclear medicine imaging

以心肌血流灌注造影為例

Gamma camera

Wikipedia, CC-BY-SA 3.0

64個 projections 中第1張

64個 projections 中第16張

高雄榮民總醫院核子醫學部 Phantom study

剛剛的 source code

		import dicom
		import pylab
		import numpy as np
		ds = dicom.read_file("img.dcm")
		pylab.imshow(ds.pixel_array[0,:,:])
		pylab.show()
	

Computed tomography 影像重建

Sinogram

高雄榮民總醫院核子醫學部 Phantom study

Sinogram - code

		import dicom
		import pylab
		import numpy as np
		ds = dicom.read_file("img.dcm")
		pylab.imshow(ds.pixel_array[:,30,:])
		pylab.show() 
	

Filtered back projection

高雄榮民總醫院核子醫學部 Phantom study

Filtered back projection - code

		import dicom
		import pylab
		from skimage.transform import iradon
		import numpy as np
		ds = dicom.read_file("img.dcm")
		sinogram = numpy.transpose(ds.pixel_array[:,35,:])
		reconstruction = iradon(sinogram)
		pylab.imshow(reconstruction)
		pylab.show()
	
		array = ds.pixel_array
		recon_3d = numpy.zeros((64,64,64))
		 
		for i in range(0,63):
			recon_3d[i,:,:] = 
		iradon(np.transpose(array[:,i,:]), output_size=64)
	

某 coronary view

		pylab.imshow(recon_3d[:,32,:])
		pylab.show()
	

高雄榮民總醫院核子醫學部 Phantom study

某 sagital view

		pylab.imshow(recon_3d[:,:,30])
		pylab.show()
	

高雄榮民總醫院核子醫學部 Phantom study

其實 dicom 還有記錄很多資訊

		ds.dir # 呈現所有欄位
		ds.PixelSpacing # pixel size
		pixel_size= ds.PixelSpacing[1]/10 # read pixel size
		pixel_volume= pixel_size**3 
	

計算超過某 threshold 的體積

		ROI = np.zeros((64,64,64)) # create a blank ROI array
		maximal = np.max(recon_3d) # 先讀最大值
		for i in range(0,63):
			for j in range(0,63):
				for k in range(0,63):
					if recon_3d[i,j,k] > 0.5*maximal:
						ROI[i,j,k]= 1
		np.sum(ROI[:,:,:])*pixel_volume
	

今天沒講的

希望突破的

Thank You

Fork me on Github