SimpleITK笔记本中ITK细分(Segmentation)介绍
SimpleITK笔记本中ITK细分(Segmentation)介绍
目标:熟悉ITK中可用的基本分割算法,并以交互方式探索其参数空间。
图像分割滤波器处理图像,将其分割成(希望)有意义的区域。输出通常是整数的图像,其中每个整数可以表示一个对象。值0通常用于背景,值1(有时为255)用于前景对象。
%matplotlib inline
import matplotlib.pyplot as plt
from ipywidgets import interact, FloatSlider
import SimpleITK as sitk
# Download data to work on
%run update_path_to_download_script
from downloaddata import fetch_data as fdata
from myshow import myshow, myshow3d
<Figure size 640x480 with 0 Axes>
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"))# 要可视化RGB中的标签图像,需要0-255范围的图像
img_T1_255 = sitk.Cast(sitk.RescaleIntensity(img_T1), sitk.sitkUInt8) # 将图像转换为sitkUInt8类型img_T2_255 = sitk.Cast(sitk.RescaleIntensity(img_T2), sitk.sitkUInt8)myshow3d(img_T1)
Fetching nac-hncma-atlas2013-Slicer4Version/Data/A1_grayT1.nrrdFetching nac-hncma-atlas2013-Slicer4Version/Data/A1_grayT2.nrrd
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KPqemDXI-1680056431591)(SimpleITK笔记本中ITK细分.fld/image001.png)]
阈值
阈值是最基本的分割形式。它只是根据强度范围对图像的像素进行标记,而不考虑几何形状或连通性。
seg = img_T1 > 200 # 阈值分割
myshow(sitk.LabelOverlay(img_T1_255, seg), "Basic Thresholding") # sitk.LabelOverlay()函数将标签图像与原始图像叠加
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ama6eTt2-1680056431595)(SimpleITK笔记本中ITK细分.fld/image002.png)]
seg = sitk.BinaryThreshold(
img_T1, lowerThreshold=100, upperThreshold=400, insideValue=1, outsideValue=0) # 二值化阈值分割
myshow(sitk.LabelOverlay(img_T1_255, seg), "Binary Thresholding")
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VgWusIqB-1680056431596)(SimpleITK笔记本中ITK细分.fld/image003.png)]
ITK有许多基于直方图的自动阈值滤波器,包括Huang,MaximumEntropy,Triangle和流行的Otsu方法。这些方法创建一个直方图,然后使用启发式方法来确定阈值。
Otsu’s method: https://en.wikipedia.org/wiki/Otsu%27s_method 大津算法的基本思想是:对于给定的图像,计算图像中所有像素的灰度值的直方图,然后从中找到一个阈值,使得在该阈值下前景和背景的类间方差最大。
otsu_filter = sitk.OtsuThresholdImageFilter() # Otsu阈值分割
otsu_filter.SetInsideValue(0) # 设置内部值
otsu_filter.SetOutsideValue(1) # 设置外部值
seg = otsu_filter.Execute(img_T1) # 执行Otsu阈值分割
myshow(sitk.LabelOverlay(img_T1_255, seg), "Otsu Thresholding") # sitk.LabelOverlay()函数将标签图像与原始图像叠加
print(otsu_filter.GetThreshold()) # 打印阈值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fa6Gl2Uc-1680056431597)(SimpleITK笔记本中ITK细分.fld/image004.png)]
236.40869140625
区域生长分割(Region Growing Segmentation)
首先改进朴素阈值的第一步是一类称为区域生长的算法。这包括:
· 连接阈值(ConnectedThreshold)
· 连接置信(ConfidenceConnected)
· 向量置信(VectorConfidenceConnected)
· 邻域连接(NeighborhoodConnected)
我们之前使用3D_Slicer来确定索引:(132,142,96)是左侧侧腔的一个好种子。
seed = (132, 142, 96) # 设置种子点
seg = sitk.Image(img_T1.GetSize(), sitk.sitkUInt8) # 创建一个与img_T1相同大小的图像
seg.CopyInformation(img_T1) # 复制图像信息
seg[seed] = 1 # 设置种子点
seg = sitk.BinaryDilate(seg, [3] * 3) # 二值膨胀
myshow(sitk.LabelOverlay(img_T1_255, seg), "Initial Seed") # sitk.LabelOverlay()函数将标签图像与原始图像叠加
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hZzwg9f6-1680056431598)(SimpleITK笔记本中ITK细分.fld/image005.png)]
seg = sitk.ConnectedThreshold(img_T1, seedList=[seed], lower=100, upper=190) # 连通阈值分割
myshow(sitk.LabelOverlay(img_T1_255, seg), "Connected Threshold") # 【译】标图叠加
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cIDf6vef-1680056431599)(SimpleITK笔记本中ITK细分.fld/image006.png)]
更好的是,置信连接滤波器使用初始种子或当前分割来估计阈值范围。
seg = sitk.ConfidenceConnected(img_T1, seedList=[seed], numberOfIterations=1, multiplier=2.5, initialNeighborhoodRadius=1, replaceValue=1) # 置信度连通分割
myshow(sitk.LabelOverlay(img_T1_255, seg), "ConfidenceConnected") # 标图叠加
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AzMUTIwj-1680056431601)(SimpleITK笔记本中ITK细分.fld/image007.png)]
img_multi = sitk.Compose(img_T1, img_T2) # 将两幅图像合并为一个多通道图像
seg = sitk.VectorConfidenceConnected(img_multi, seedList=[seed], numberOfIterations=1, multiplier=2.5, initialNeighborhoodRadius=1) # 多通道置信度连通分割
myshow(sitk.LabelOverlay(img_T1_255, seg), "VectorConfidenceConnected") # 标图叠加
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gUlYxOw7-1680056431602)(SimpleITK笔记本中ITK细分.fld/image008.png)]
快进分割(Fast Marching Segmentation)
快进图像滤波器实现了一个快速行进的简单水平集演化问题(欧几里得方程)的解决方案。在这个例子中,微分方程中使用的速度项以图像的形式提供。速度图像基于梯度幅度,并映射为有界倒数1/(1+
Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ... 行泊一体中的感知能力介绍,数据闭环.BEV感知方案等,nullmax纽劢科技CV首席科学家成二康博士的分享 Nullmax 感知部总监兼计算机视觉首席科学家成二康博士,前段时间做客汽车之心·行家说栏目 ... ThinkPad T460p笔记本中Win10+Ubuntu17.04双系统安装方法(UEFI引导模式) 本人有一台ThinkPad T460p型笔记本电脑,只有一块硬盘,需在该硬盘上同时安装Win1 ... 在 笔记本 使用的过程中总会出现更换键盘.更换固态硬盘.内存条等情况,有时还需对笔记本进行清灰.改造散热处理,升级SSD更是眼下最流行的改造,这个时候就需要对笔记本进行拆解.那么,笔记本电脑如何正确拆 ... 内容提要:笔记本保养技巧的详细介绍,刚买的笔记本我们应该好好爱惜它,那么如何保养笔记本电脑?本文小编就为大家介绍几种常见的笔记本电脑不正当使用方式. 刚买的笔记本我们应该好好爱惜它,那么如何保 ... 在 笔记本 使用的过程中总会出现更换键盘.更换固态硬盘.内存条等情况,有时还需对笔记本进行清灰.改造散热处理,升级SSD更是眼下最流行的改造,这个时候就需要对笔记本进行拆解.那么,笔记本电脑如何正确拆 ... Blender中的Python脚本介绍学习教程 MP4 |视频:h264,1280×720 |音频:AAC,48000 Hz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:1.63 ... 链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 本章节我们重点在于实现,如何存储任务的结果. 我们将任务函数改为: from celery_demo.celery im ... Python 中pandas.read_excel详细介绍 #coding:utf-8 import pandas as pd import numpy as np filefullpath = r& ...SimpleITK笔记本中ITK细分(Segmentation)介绍相关推荐
最新文章
热门文章