【SimpleITK】使用区域生长法分割肺-CT img

守給你的承諾、 提交于 2020-02-05 11:46:09

区域生长

定义参考 维基百科 :
对图像分割的定义:

图像分割是对图像中的每个像素加标签的一个过程,这一过程使得具有相同标签的像素具有某种共同视觉特性。

区域生长的定义:

区域生长的基本思想是将具有相似性质的像素集合起来构成区域。具体先对每个需要分割的区域找一个种子像素作为生长的起点,然后将种子像素周围邻域中与种子像素具有相同或相似性质的像素(根据某种事先确定的生长或相似准则来判定)合并到种子像素所在的区域中。将这些新像素当做新的种子像素继续进行上面的过程,直到再没有满足条件的像素可被包括进来,这样,一个区域就长成了。

定义简单明了。

由定义可知,区域生长的三个要点:

  1. 种子点
  2. 生长准则
  3. 终止条件

根据不同的生长准则和终止条件有不同的区域生长算法。
本次使用的是Confidence Connected。

Confidence Connected

参考官方文档: http://insightsoftwareconsortium.github.io/SimpleITK-Notebooks/Python_html/30_Segmentation_Region_Growing.html

This region growing algorithm allows the user to implicitly specify the threshold bounds based on the statistics estimated from the seed points, 𝜇±𝑐𝜎 . This algorithm has some flexibility which you should familiarize yourself with:
参数 :

  • multiplier : the constant 𝑐 from the formula above.
    You can specify a region around each seed point
  • initialNeighborhoodRadius : he statistics are estimated, see what happens when you set it to zero.
  • numberOfIterations : to rerun the algorithm.
    • In the first run the bounds are defined by the seed voxels you specified, in the following iterations 𝜇 and 𝜎 are estimated from the segmented points and the region growing is updated accordingly.

肺窗

肺窗WW1500—2000HU 、WL-450—-600HU

代码

导入simpleITK:

import SimpleITK as sitk
import matplotlib.pyplot as plt 
WINDOW_LEVEL = (1000,-500)

导入数据:

img_path =...”
img = sitk.ReadImage(img_path)
img.GetSize()

(512, 512, 121)
查看其中一层:

img_arr = sitk.GetArrayFromImage(img)
plt.imshow(img_arr[68])

在这里插入图片描述
调整图像到肺窗!

img_norm = sitk.Cast(sitk.IntensityWindowing(img,
                                  windowMinimum=WINDOW_LEVEL[1] - WINDOW_LEVEL[0] / 2.0,
                                  windowMaximum=WINDOW_LEVEL[1] + WINDOW_LEVEL[0] / 2.0),
                                  sitk.sitkUInt8)

显示下肺窗下的图像:

img_norm_arr = sitk.GetArrayFromImage(img_norm)
plt.imshow(img_norm_arr[68], cmap='bone')

在这里插入图片描述

使用区域生长法分割:

seed_pts = [(108, 246, 68), (390, 255, 68)]
img_grow_Confidence = sitk.ConfidenceConnected(img, seedList=seed_pts,
                                                           numberOfIterations=0,
                                                           multiplier=2,
                                                           initialNeighborhoodRadius=1,
                                                           replaceValue=1)

打印结果:

img_grow_arr_Confidence = sitk.GetArrayFromImage(img_grow_Confidence)
plt.imshow(img_grow_arr_Confidence[68])

在这里插入图片描述
结果上有很多的空洞需要填补。
对结果进行闭包处理:

  • BinaryMorphologicalClosingImageFilter
BMC = sitk.BinaryMorphologicalClosingImageFilter()
BMC.SetKernelType(sitk.sitkBall)
BMC.SetKernelRadius(2)
BMC.SetForegroundValue(1)
OUT = BMC.Execute(img_grow_Confidence)

显示下闭包之后的结果:

ov_close = sitk.LabelOverlay(img_norm, OUT)
plt.imshow(sitk.GetArrayFromImage(ov_close)[68])

在这里插入图片描述
此方法的唯一缺点是需要手动 定种子点。
更好的方法在如下链接:

https://www.cnblogs.com/WAoyu/p/12037576.html

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!