Python對DICOM圖像進行閾值分割


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圖像,分割其他組織器官。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM