SimpleITK三维图像分析

  • 1、去除3D 小连通域
  • 2、【医学图像处理】之腹部骨骼提取(SimpleITK)

1、去除3D 小连通域

在一些计算机视觉任务中,需要对模型的输出做一些后处理以优化视觉效果,连通域就是一种常见的后处理方式。尤其对于分割任务,有时的输出mask会存在一些假阳(小的无用轮廓),通过3D连通域找出面积较小的独立轮廓并去除可以有效地提升视觉效果。

二维图像连通域一般包括 4连通、8连通。对于三维数据一般包括6连通、18连通和26联通。
下面的代码只保留最大3D连通域。

# -*- coding : UTF-8 -*-
# @file   : prob2label.py
# @Time   : 2021-10-19 9:35
# @Author : wmzimport os
import SimpleITK as sitk
from glob import glob
import numpy as npdef getFiles(path, suffix):return [os.path.join(root, file) for root, dirs, files in os.walk(path) for file in files if file.endswith(suffix)]def connected_domain_2(image, mask=True):cca = sitk.ConnectedComponentImageFilter()cca.SetFullyConnected(True)_input = sitk.GetImageFromArray(image.astype(np.uint8))output_ex = cca.Execute(_input)stats = sitk.LabelShapeStatisticsImageFilter()stats.Execute(output_ex)num_label = cca.GetObjectCount()num_list = [i for i in range(1, num_label+1)]area_list = []for l in range(1, num_label +1):area_list.append(stats.GetNumberOfPixels(l))num_list_sorted = sorted(num_list, key=lambda x: area_list[x-1])[::-1]largest_area = area_list[num_list_sorted[0] - 1]final_label_list = [num_list_sorted[0]]# for idx, i in enumerate(num_list_sorted[1:]):  # 大于第一个的十分之一的都保留,注释掉之后只保留最大连通域#     if area_list[i-1] >= (largest_area//10):#         final_label_list.append(i)#     else:#         breakoutput = sitk.GetArrayFromImage(output_ex)for one_label in num_list:if one_label in final_label_list:continuex, y, z, w, h, d = stats.GetBoundingBox(one_label)one_mask = (output[z: z + d, y: y + h, x: x + w] != one_label)output[z: z + d, y: y + h, x: x + w] *= one_maskif mask:output = (output > 0).astype(np.uint8)else:output = ((output > 0)*255.).astype(np.uint8)return outputdef save_prob2label(prob_dir, save_labeldir):# all_prob_seg = glob(os.path.join(prob_dir, "*.nrrd"))all_prob_seg = getFiles(prob_dir, ".nrrd")for index, file in enumerate(all_prob_seg):print("processing", index + 1, '/', len(all_prob_seg), file)label_file = file.replace(prob_dir, save_labeldir).replace(".nrrd", ".nii.gz")prob_img = sitk.ReadImage(file)prob_arr = sitk.GetArrayFromImage(prob_img)label_arr = (prob_arr > Dice_value) * 1label_arr = connected_domain_2(label_arr)label_img = sitk.GetImageFromArray(label_arr)label_img.SetOrigin(prob_img.GetOrigin())label_img.SetDirection(prob_img.GetDirection())dst_dir = label_file.rsplit('\\', 1)[0]if not os.path.exists(dst_dir):os.makedirs(dst_dir)sitk.WriteImage(label_img, label_file)if __name__ == '__main__':prob_nrrd_dir = r'C:\Users\wmz\Desktop\input'save_label_dir = r'C:\Users\wmz\Desktop\test'Dice_value = 0.5save_prob2label(prob_nrrd_dir, save_label_dir)

参考:python实现3D连通域后处理

2、【医学图像处理】之腹部骨骼提取(SimpleITK)

1.内容
步骤:
1.读取Dicom序列
2.设置固定阈值为100,把骨骼和心脏及主动脉都分割出来
3.形态学开运算+最大连通域提取,粗略的心脏和主动脉图像
4.将step1的结果与step2的结果相减,得到骨骼部分
5.最大连通域提取,去除小连接
6.将得到的图像与原始图像进行逻辑与操作
数据地址:
链接:https://pan.baidu.com/s/198H5g30LSKrKInJfgV1xFQ
提取码:a3nw

import SimpleITK as sitk# 最大连通域提取
def GetLargestConnectedCompont(binarysitk_image):cc = sitk.ConnectedComponent(binarysitk_image)stats = sitk.LabelIntensityStatisticsImageFilter()stats.SetGlobalDefaultNumberOfThreads(8)stats.Execute(cc, binarysitk_image)maxlabel = 0maxsize = 0for l in stats.GetLabels():size = stats.GetPhysicalSize(l)if maxsize < size:maxlabel = lmaxsize = sizelabelmaskimage = sitk.GetArrayFromImage(cc)outmask = labelmaskimage.copy()outmask[labelmaskimage == maxlabel] = 255outmask[labelmaskimage != maxlabel] = 0outmask_sitk = sitk.GetImageFromArray(outmask)outmask_sitk.SetDirection(binarysitk_image.GetDirection())outmask_sitk.SetSpacing(binarysitk_image.GetSpacing())outmask_sitk.SetOrigin(binarysitk_image.GetOrigin())return outmask_sitk# 逻辑与操作
def GetMaskImage(sitk_src, sitk_mask, replacevalue=0):array_src = sitk.GetArrayFromImage(sitk_src)array_mask = sitk.GetArrayFromImage(sitk_mask)array_out = array_src.copy()array_out[array_mask == 0] = replacevalueoutmask_sitk = sitk.GetImageFromArray(array_out)outmask_sitk.SetDirection(sitk_src.GetDirection())outmask_sitk.SetSpacing(sitk_src.GetSpacing())outmask_sitk.SetOrigin(sitk_src.GetOrigin())return outmask_sitk# 读取Dicom序列
pathDicom = 'D:/PyCharm 2019.3.3/data/LIDC_nodul'
reader = sitk.ImageSeriesReader()
filenamesDICOM = reader.GetGDCMSeriesFileNames(pathDicom)
reader.SetFileNames(filenamesDICOM)
sitk_src = reader.Execute()# step1.设置固定阈值为100,把骨骼和心脏及主动脉都分割出来
sitk_seg = sitk.BinaryThreshold(sitk_src, lowerThreshold=100, upperThreshold=3000, insideValue=255, outsideValue=0)
sitk.WriteImage(sitk_seg, 'step1.mha')# step2.形态学开运算+最大连通域提取,粗略的心脏和主动脉图像
sitk_open = sitk.BinaryMorphologicalOpening(sitk_seg != 0, 2)
sitk_open = GetLargestConnectedCompont(sitk_open)
sitk.WriteImage(sitk_open, 'step2.mha')# step3.再将step1的结果与step2的结果相减,得到骨骼部分
array_open = sitk.GetArrayFromImage(sitk_open)
array_seg = sitk.GetArrayFromImage(sitk_seg)
array_mask = array_seg - array_open
sitk_mask = sitk.GetImageFromArray(array_mask)
sitk_mask.SetDirection(sitk_seg.GetDirection())
sitk_mask.SetSpacing(sitk_seg.GetSpacing())
sitk_mask.SetOrigin(sitk_seg.GetOrigin())
sitk.WriteImage(sitk_mask, 'step3.mha')# step4.最大连通域提取,去除小连接
skeleton_mask = GetLargestConnectedCompont(sitk_mask)
sitk.WriteImage(skeleton_mask, 'step4.mha')# step5.将得到的图像与原始图像进行逻辑与操作
sitk_skeleton = GetMaskImage(sitk_src, skeleton_mask, replacevalue=-1500)
sitk.WriteImage(sitk_skeleton, 'step5.mha')

参考:【医学图像处理】之腹部骨骼提取(SimpleITK)

SimpleITK三维图像分析相关推荐

  1. 脑功能成像大杂烩|有此神器,神经影像配准不再需要高分辨3D T1w

    1. 导读: 全球每年有数以百万计的脑部磁共振成像( magnetic resonance imaging,MRI )图像在医院产生.这些有可能彻底改变我们对许多神经系统疾病的理解,但由于它们的各向异 ...

  2. 有此神器,神经影像配准不再需要高分辨3D T1w

    目录 1.导读 2.SynthSR开发背景 3.Free Surfer中如何调用SynthSR 4.SynthSR在临床中的应用 5.结论 1. 导读: 全球每年有数以百万计的脑部磁共振成像( mag ...

  3. Python SimpleITK提取三维Canny Sobel边界代码

    ** Canny 边界提取(三维.二维都可) ** import os import numpy as np import SimpleITK as sitkdata_dir = r'6 (1)_la ...

  4. 随机样本一致性:一种用于图像分析和自动制图的模型拟合模型(4)--(计算透视中心的三维位置)

    (一)计算透视中心的三维位置 给出了透视四面体的三个控制点和三条腿的长度,透视中心的三维位置可以确定如下: (1)构造一个平面P1,它相对于平面P-ABL是正交的.这个平面的构造不需要知道透视中心L的 ...

  5. 机器人视觉三维成像技术全解析

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 在工业4.0时代,国家智能制造高速发展,传统的编程来执行某一动作的 ...

  6. mhd格式三维图像显示_人体面骨三维有限元模型重构及碰撞分析

    摘要: 本文实现了螺旋CT图像构建面颅骨三维有限元模型过程,用CT断层图像输入计算机,采用CT图像三维再现软件和CAD软件构建轮廓线,用非规则形体.有限元软件Ansys划分网格.此模型包括上颌骨.鼻骨 ...

  7. 物体的三维识别与6D位姿估计:PPF系列论文介绍(三)

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 文章"A Method for 6D Pose Estimation of Free-For ...

  8. 真·降维打击:这篇SIGGRAPH 2020论文帮你「想象」三维生物眼里的四维空间

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 四维空间是什么样子?里面的物体如何运动?一篇 SIGGRAPH 2020 论文帮我们 "想象 ...

  9. 物体的三维识别与6D位姿估计:PPF系列论文介绍(四)

    文章"3D Pose Estimation of Daily ObjectsUsing an RGB-D Camera"2012发表在IEEE/RSJInternational C ...

最新文章

  1. 计算字符串和文件的MD5值
  2. 基于深度卷积神经网络进行人脸识别的原理是什么?
  3. 令牌桶的自定义注解核心API演示
  4. python三十六:shelve模块
  5. vivo android8公测,vivo 开启安卓P公测不限人数!这四款机型用户别错过了
  6. ubuntu cmake交叉编译时报错:没有那个文件或目录
  7. Java并发常用方法 sleep 和 wait
  8. restful风格_什么是RESTful风格的API设计?
  9. android - 小技巧合集(不断更新)
  10. ifpc币_劳力士手表价格表一览表
  11. Homebrew基本命令
  12. Vue:安装Vue Devtools调试工具简便方法解决Cannot find module webpack-cli,@vue-devtools/build-tools等
  13. 送书 | 新书《Python科学计算入门与实战》
  14. android开机自动打开微信小程序,Android应用启动微信小程序
  15. ICD3 - Cannot connect to USB device. Unrecognized endpoint.
  16. java xheditor,xhEditor不能支持本map片上传,请问
  17. 3 条掏心掏肺的建议,新手学习编程必备,快上车!
  18. 评估电源质量20M带宽限制的问题
  19. HTML5自学笔记上
  20. 不想充文库会员(百度文库,360文库等),又急需复制粘贴咋整?JavaScript一键解决

热门文章

  1. 加密货币市值、股市市值、房地产价值
  2. 努力工作的软文_我所知道的是如何努力工作。
  3. 助力共享出行, 实现城市管理数字化和智能化
  4. WINSOFT ComPort轻松连接到各种串行端口和连接设备
  5. 无模考,不联考,2023年MBA/MEM/MPA联考提分必用利器之一
  6. linux 设备驱动 edition 3,Linux 设备驱动 Edition 3 在线书
  7. win 10 pip 安装都超时_清华Anaconda 镜像恢复及一键安装气象常用的Python库
  8. webots(webot社群助手)
  9. c语言中register是局部变量吗,auto、static、register及全局变量和局部变量
  10. 简单总结无线CPE、无线AP、无线网桥的不同之处【转】