图像分割filters对图像进行处理,将其分割成有意义的区域,通常输出一个整数图像,其中每个整数代表一个目标,值0通常表示背景,1或255表示前景对象。
img_T1 = sitk.ReadImage(fdata("nac-hncma-atlas2013-Slicer4Version/Data/A1_grayT1.nrrd"))
img_T2 = sitk.ReadImage(fdata("nac-hncma-atlas2013-Slicer4Version/Data/A1_grayT2.nrrd"))
# 为了可视化图像,将图像转化为0到255
img_T1_255 = sitk.Cast(sitk.RescaleIntensity(img_T1), sitk.sitkUInt8)
img_T2_255 = sitk.Cast(sitk.RescaleIntensity(img_T2), sitk.sitkUInt8)
阈值分割是最基本的分割方式,它只是简单地基于灰度范围标记图像地像素,而不考虑几何或连通性。
Itk 有许多基于直方图的自动阈值过滤器,包括 Huang,maximiumentropy,Triangle,和流行的 Otsu 方法。 这些方法创建直方图,然后使用启发式方法确定阈值。
otsu_filter = sitk.OtsuThresholdImageFilter()
otsu_filter.SetInsideValue(0)
otsu_filter.SetOutsideValue(1)
seg = otsu_filter.Execute(img_T1)
myshow(sitk.LabelOverlay(img_T1_255, seg), "Otsu Thresholding")
otsu_filter.GetThreshold()
区域增长分割
seg = sitk.ConfidenceConnected(img_T1, seedList=[seed],
numberOfIterations=1,
multiplier=2.5,
initialNeighborhoodRadius=1,
replaceValue=1)
myshow(sitk.LabelOverlay(img_T1_255, seg), "ConfidenceConnected")
快速步进算法
快速步进算法实现了对简单水平集进化问题地解决算法,在这个例子中,微分方程中使用地速度参数是以图像地形式来提供地。速度图像是基于梯度的大小,并用有界倒数1/(1+x)来映射。
seed = (132,142,96)
feature_img = sitk.GradientMagnitudeRecursiveGaussian(img_T1, sigma=.5)
speed_img = sitk.BoundedReciprocal(feature_img) # 不想sigma函数不需要参数
myshow(speed_img)
Fastmarchingmagefilter的输出是一个跨时间的映射,它表示对于每个像素,前端到达该像素点需要花费多少时间。
fm_filter = sitk.FastMarchingBaseImageFilter()
fm_filter.SetTrialPoints([seed])
fm_filter.SetStoppingValue(1000)
fm_img = fm_filter.Execute(speed_img)
myshow(sitk.Threshold(fm_img,
lower=0.0,
upper=fm_filter.GetStoppingValue(),
outsideValue=fm_filter.GetStoppingValue()+1))