itk

SimpleITK学习(一)基本概念

Deadly 提交于 2020-11-25 03:13:58
断断续续使用simpleitk处理CT和X光图片有些时间了,但是学的知识都比较零散,没有形成系统的概念,于是对着SimpleITK的英文文档 https://simpleitk.readthedocs.io/en/master/index.html 学习一遍,再结合自己的一点经验,做一点总结。 SimpleITK是ITK的简化接口,使用起来更加方便,有多种语言接口,我平时用的都是python版,安装比较简单,pip install SimpleITK即可 SimpleITK是专门处理医学影像的软件,在SimpleITK中,图像的概念与我们在计算机视觉中常用的RGB图像差异很大,后者只是一个多维矩阵,是一个数学上的概念,而在SimpleITK中,图像是一种物理实体,图像中的每一个像素都是物理空间中的一个点,不光有着像素值,还有着坐标,间距,方向等概念 下图是一个直观的解释 size:图像在各维度的像素个数 spacing:图像各维度上像素之间的距离(物理层面的,有单位,一般为mm) physical extent:图像在物理空间中的大小 Origin:图像原点的坐标(物理层面的,有单位,一般为mm,与spacing保持一致) direction:采用方向余弦矩阵,也就是图像自身坐标系相对于世界坐标系(固定不动的)的角度,再直白点就是新坐标系在原坐标系上各个方向的投影,百度百科

simpleitk打开dicom文件

心已入冬 提交于 2020-11-25 02:48:02
ITK是一个功能很强大的医学图像处理公开库,搭配VTK用以显示图像,可以实现几乎所有医学图像处理的功能需要。ITK通常以C++包进行提供,当然也可以自己编译为Python包,不过编译过程比较繁琐耗时,而且很容易踩坑。但ITK官方进行的Python封装SimpleITK,则直接可以拿来使用;虽然有部分ITK的功能没有包含,但已基本够用了。我们在处理医学图像时,使用的基本都是SimpleITK。 本文就简单总结一下我们在处理这些图像时的经验,以便备忘,并为后来者参考。 1.读取文件 读取DICOM序列 医学图像中一个CT序列包含很多张图片,即一个case包含许多slice,使用SimpleITK可以直接读取一个序列,并方便地得到各种参数,将图像数据转换成numpy Array: import SimpleITK as sitk import numpy as np reader = sitk. ImageSeriesReader ( ) dicom_names = reader. GetGDCMSeriesFileNames ( case_path ) reader. SetFileNames ( dicom_names ) image = reader. Execute ( ) image_array = sitk. GetArrayFromImage ( image ) # z,

五、如何通过CT三维图像得到DRR图像

走远了吗. 提交于 2020-10-26 06:05:26
一、介绍   获取DRR图像是医疗图像配准里面的一个重要的前置步骤:它的主要目的是,通过CT三维图像,获取模拟X射线影像,这个过程也被称为数字影响重建。   在2D/3D的配准流程里面,需要首先通过CT三维图像,能够获取任意位置的DRR图像,然后去与已经获取的X光平面图像配准。   配准过程如下(下面的描述是不准确的,我只是描述了一种情况,即基于灰度的图像配准算法的过程,并且可能会有纰漏):   1- 定义一个评价函数:即相似性测度函数,通过这个函数评价当前是否已经达到了配准的要求。   2- 不断通过调整输入参数得到不同角度下的DRR图像。   3-通过1里面的评价函数判断是否停止搜索   实际上这是一个循环,终止条件就是是否满足相似性测度函数。   具体流程可以参考下面的流程图:    二、DRR例子运行   在ITK5.0里面有一个相关的例子,我也是跑了好久才把程序跑通的,跑通以后就觉得做了许多的无用功......   说到底还是菜,跑一个程序就要两周,醉了(好吧,吐槽完毕^-^)   1-找到例子,构建工程   按照之前第一个 博客 的过程安装ITK之后,我们找到这个例子所在的位置:    ITK-5.0/Examples/Filtering/DigitallyReconstructedRadiograph1.cxx 例子的代码也可以在这里找到:    https:/

五、如何通过CT三维图像得到DRR图像

蹲街弑〆低调 提交于 2020-10-23 11:03:17
一、介绍   获取DRR图像是医疗图像配准里面的一个重要的前置步骤:它的主要目的是,通过CT三维图像,获取模拟X射线影像,这个过程也被称为数字影响重建。   在2D/3D的配准流程里面,需要首先通过CT三维图像,能够获取任意位置的DRR图像,然后去与已经获取的X光平面图像配准。   配准过程如下(下面的描述是不准确的,我只是描述了一种情况,即基于灰度的图像配准算法的过程,并且可能会有纰漏):   1- 定义一个评价函数:即相似性测度函数,通过这个函数评价当前是否已经达到了配准的要求。   2- 不断通过调整输入参数得到不同角度下的DRR图像。   3-通过1里面的评价函数判断是否停止搜索   实际上这是一个循环,终止条件就是是否满足相似性测度函数。   具体流程可以参考下面的流程图:    二、DRR例子运行   在ITK5.0里面有一个相关的例子,我也是跑了好久才把程序跑通的,跑通以后就觉得做了许多的无用功......   说到底还是菜,跑一个程序就要两周,醉了(好吧,吐槽完毕^-^)   1-找到例子,构建工程   按照之前第一个 博客 的过程安装ITK之后,我们找到这个例子所在的位置:    ITK-5.0/Examples/Filtering/DigitallyReconstructedRadiograph1.cxx 例子的代码也可以在这里找到:    https:/

五、如何通过CT三维图像得到DRR图像

爷,独闯天下 提交于 2020-10-18 13:55:11
一、介绍   获取DRR图像是医疗图像配准里面的一个重要的前置步骤:它的主要目的是,通过CT三维图像,获取模拟X射线影像,这个过程也被称为数字影响重建。   在2D/3D的配准流程里面,需要首先通过CT三维图像,能够获取任意位置的DRR图像,然后去与已经获取的X光平面图像配准。   配准过程如下(下面的描述是不准确的,我只是描述了一种情况,即基于灰度的图像配准算法的过程,并且可能会有纰漏):   1- 定义一个评价函数:即相似性测度函数,通过这个函数评价当前是否已经达到了配准的要求。   2- 不断通过调整输入参数得到不同角度下的DRR图像。   3-通过1里面的评价函数判断是否停止搜索   实际上这是一个循环,终止条件就是是否满足相似性测度函数。   具体流程可以参考下面的流程图:    二、DRR例子运行   在ITK5.0里面有一个相关的例子,我也是跑了好久才把程序跑通的,跑通以后就觉得做了许多的无用功......   说到底还是菜,跑一个程序就要两周,醉了(好吧,吐槽完毕^-^)   1-找到例子,构建工程   按照之前第一个 博客 的过程安装ITK之后,我们找到这个例子所在的位置:    ITK-5.0/Examples/Filtering/DigitallyReconstructedRadiograph1.cxx 例子的代码也可以在这里找到:    https:/

十二、ITK例程-医疗图像配准的HelloWorld程序

不问归期 提交于 2020-08-20 08:23:21
一、说明   医疗图像配准是ITK的一个重要内容,而我们今天想要说的一个程序则相当于是其中的HelloWorld程序。   程序源码位置: InsightToolkit- 5.0 . 1 \Examples\RegistrationITKv4\\ImageRegistration1.cxx 二、ITK的配准框架    三、程序的主要思路   程序的主要思路可以用如下的框图来表示:      其中我们需要输入输出的文件如下:      但是在这里,为了便于程序阅读,这个时候我把所有的参数全部都写在了程序里面。 四、工程构建  1-构建工程   按照之前的方法,利用已经有的源文件构建一个工程,并且添加属性表和动态链接库文件。  2-程序修改   源码程序这个时候不是能用的,需要稍作修改   2.1将每一个argv参数的位置直接修改为文件名   参数含义如下: 参数 内容 argv[1] 参考图片 argv[2] 待配准图片 argv[3] 输出待配准图片(以参考图片格式输出) argv[4] 两个输入图片配准之后的差值图片 argv[5] 两个输入图片未配准的时候的差值图片   实际程序里面修改: //参考图片位置 fixedImageReader->SetFileName( " D:\\FilesSetup\\ITK\\InsightToolkit-5.0.1\\Examples\

四、关于如何使用软件库的一个技巧-避免重复配置属性表

心不动则不痛 提交于 2020-05-07 12:50:06
一、前言 我们需要使用各种函数库,比如Opencv,Itk, vtk,当不同的函数库使用的时候,在VS配置属性是一个很麻烦的问题,并且设计到不同函数库的交叉使用,所以这里提供一个小技巧。   那就是我们把每一个函数库的配置为属性表的形式(这个其实我在itk的安装里面已经介绍过),需要使用什么函数库的时候,我们只需要添加对应的属性表即可。 二、以QT使用vtk工程为例子 我们建立了一个工程以后,选择工程配置为release x64版本 1、选择属性管理器 2、右键添加-新建属性表 3、然后定义属性表格的位置和名称 4、在VTK属性表里面选择右键,属性 5、出现如下的界面: 6、选择VC++ 然后配置包含目录为VTK的安装路径的inlcude文件夹      配置库目录为VTK安装路径的lib文件夹。 7、然后配置C++,常规 8、配置链接器,附加依赖项 在附加依赖项里面输入所有的安装文件夹\lib\里面的所有的lib文件名 然后保存。 9、其他工程使用 下次需要使用的时候我们直接把这个属性复制到对应的工程里面,然后选择Release x64选项,然后右键点击添加-》现有属性表 这样就避免了二次配置。 其他的函数库的配置也是类似的。 当我们需要使用这个函数库的时候,我们只需要把这个对应的属性表格通过属性管理器添加就好。 三、QT属性表的配置 属性表过程类似,只把具体参数列举出来:

遗传算法求最短路径

假装没事ソ 提交于 2020-04-11 07:45:04
无所事事,就想找个题目练一下遗传算法。然后想到可以用遗传算法找遍历给定城市的最短路径。从网上搜了一些中国的城市,各城市之间的距离取它们之间的直线距离,每个城市一个编号,然后每个所有编号构成的排列就是一个解,每个解会得到一个相应的总距离。问题就变成寻找最优排列的问题。 用遗传算法处理这个问题,先随机生成一群初始解作为初始种群。每个解作为一个个体可以进行增殖和变异,然后种群的数量增加,再通过筛选函数以更高的概率挑选一部分更加满足要求的个体进行增殖,通过数代的进化,以期得到总距离尽可能短的解。写好程序测试后发现效果还不错。 下面是对程序中一些问题的说明。遗传算法中的一步是要求两个个体通过交叉和变异产生一个新个体,模仿生物的有性生殖。但是对于两个12345或者31452的排列,实在不知道该怎么进行交叉。所以程序只对原始排列进行变异,但是不进行两个排列之间的交叉。 变异的方法可以有很多,这里为了提高程序的运行速度,把变异分为两点之间交换和两个序列之间的交换,其中序列交换时可以进行翻转。 在程序运行过程中发现种群的进化速度较慢,一些优秀的个体会因为随机性被淘汰,所以程序里加上了保留最优个体的规则。尽管这样做可能会降低种群的多样性,降低算法对所有解的“遍历性”,但是实践发现确实能够得到更好的解,而且解优化的速度快很多。不保留最优个体的时候优化速度在越接近极值的时候速度越慢,甚至不会进一步优化

Teamcenter二次开发介绍及资料

自古美人都是妖i 提交于 2020-03-08 21:36:56
1、RCP客户端开发 Teamcenter客户化RCP二次开发 2、SOA集成开发 Teamcenter客户化SOA二次开发 3、ITK服务端开发 Teamcenter客户化ITK二次开发 4、Utility Teamcenter客户化Utility二次开发 5、AWC Teamcenter客户化AWC二次开发 6、系统集成 Teamcenter客户化之系统集成 7、 RCP,ITK及SOA二次开发资料获取方式 来源: CSDN 作者: 杀红眼的关羽 链接: https://blog.csdn.net/u014457991/article/details/104739413

How to do histogram equalization to DICOM images read with SimpleITK

浪尽此生 提交于 2020-03-03 08:05:08
问题 I'm trying to do histogram equalization to all images read from a *.nii.gz file. I have tried this code: import SimpleITK as sitk flair_file = '/content/gdrive/My Drive/Colab Notebooks/.../FLAIR.nii.gz' images = sitk.ReadImage(flair_file) print("Width: ", images.GetWidth()) print("Height:", images.GetHeight()) print("Depth: ", images.GetDepth()) print("Dimension:", images.GetDimension()) print("Pixel ID: ", images.GetPixelIDValue()) print("Pixel ID Type:", images.GetPixelIDTypeAsString())