医学图像dicom的读取

1、cv2.findContours()函数

cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])  

第一个参数是寻找轮廓的图像;
第二个参数表示轮廓的检索模式,有四种:
cv2.RETR_EXTERNAL表示只检测外轮廓
cv2.RETR_LIST检测的轮廓不建立等级关系
cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
cv2.RETR_TREE建立一个等级树结构的轮廓。
第三个参数method为轮廓的近似办法
cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1
cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法
详细链接
参考资料

读取dicom代码

import cv2
import numpy
import pydicom
from matplotlib import pyplot as plt

# 读取单张Dicom图像
dcm = pydicom.read_file("1.3.6.1.4.1.5962.99.1.2786334768.1849416866.1385765836848.2.0.dcm")
dcm.image = dcm.pixel_array * dcm.RescaleSlope + dcm.RescaleIntercept

# 获取图像中的像素数据
slices = []
slices.append(dcm)

# 复制Dicom图像中的像素数据
img = slices[ int(len(slices)/2) ].image.copy()

# 对图像进行阈值分割
# 转化为黑白2色的图 超过90设置为0 低于90设置为0
ret,img = cv2.threshold(img, 90,3071, cv2.THRESH_BINARY)
# print(img[100][:])
img = numpy.uint8(img)
# cv2.imshow('img',img)
# cv2.waitKey(0)
# print(img[100][:])

# 提取分割结果中的轮廓,并填充孔洞
# cv2.findContours()函数来查找检测物体的轮廓
im2, contours, _ = cv2.findContours(img,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
mask = numpy.zeros(img.shape, numpy.uint8)
# print(contours)
print (type(contours))
print (type(contours[0]))
print (len(contours))
for contour in contours:
    # print(contour)
    cv2.fillPoly(mask, [contour], 255)
img[(mask > 0)] = 255

# 对分割结果进行形态学的开操作
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(2,2))
'''
print(kernel) 3*3 大小时生成椭圆 cv2.MORPH_ELLIPSE
[[0 1 0]
 [1 1 1]
 [0 1 0]]
'''
print(kernel)
# 闭运算
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=(20, 20))
#           行 列 编号
plt.subplot(1,3,1)
plt.imshow(slices[int(len(slices) / 2)].image, 'gray')
plt.title('Original')
plt.subplot(1,3,2)
plt.imshow(img, 'gray')
plt.title('Mask')
plt.subplot(1,3,3)
plt.imshow(img2, 'gray')
plt.title('Result')
plt.show()
医学图像dicom的读取_第1张图片
结果图

你可能感兴趣的:(医学图像dicom的读取)