Python對Dicom圖像進行處理,離不開pydicom,opencv-python,matplotlib,numpy四個代碼庫,安裝完成這四個代碼庫后,
可以讀取Dicom圖像,並對圖像進行處理,顯式處理后的結果,下面就舉例說明:
import cv2 import numpy import dicom from matplotlib import pyplot as plt # 讀取單張Dicom圖像 dcm = dicom.read_file("../Data/vhm.420.dcm") dcm.image = dcm.pixel_array * dcm.RescaleSlope + dcm.RescaleIntercept # 獲取圖像中的像素數據 slices = [] slices.append(dcm) # 復制Dicom圖像中的像素數據 img = slices[ int(len(slices)/2) ].image.copy() # 對圖像進行閾值分割 ret,img = cv2.threshold(img, 90,3071, cv2.THRESH_BINARY) img = numpy.uint8(img) # 提取分割結果中的輪廓,並填充孔洞 im2, contours, _ = cv2.findContours(img,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE) mask = numpy.zeros(img.shape, numpy.uint8) for contour in contours: cv2.fillPoly(mask, [contour], 255) img[(mask > 0)] = 255 # 對分割結果進行形態學的開操作 kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(2,2)) img = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) # 根據分割mask獲取分割結果的像素數據 img2 = slices[ int(len(slices)/2) ].image.copy() img2[(img == 0)] = -2000 # 顯式原始數據,mask和分割結果 plt.figure(figsize=(12, 12)) plt.subplot(131) plt.imshow(slices[int(len(slices) / 2)].image, 'gray') plt.title('Original') plt.subplot(132) plt.imshow(img, 'gray') plt.title('Mask') plt.subplot(133) plt.imshow(img2, 'gray') plt.title('Result') plt.show()
運行后的結果:
本例子以單張Dicom圖像為例,分割圖像中的骨骼信息,也可以同時讀取多張Dicom圖像,分割其他組織器官。