Python对DICOM图像进行阈值分割

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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图像,分割其他组织器官。

以上是关于Python对DICOM图像进行阈值分割的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV-Python实战——OpenCV用于图像分割的阈值技术(含大量示例,建议收藏)

基于阈值的7种图像分割方法以及Python实现

计算机视觉,基于skimage对图像阈值分割的学习

计算机视觉,基于skimage对图像阈值分割的学习

[Python从零到壹] 六十.图像识别及经典案例篇之基于阈值及边缘检测的图像分割

[Python图像处理] 四十.全网首发Python图像分割万字详解(阈值分割边缘分割纹理分割分水岭算法K-Means分割漫水填充分割区域定位)