首页 > 其他分享 >SimpleITK 图像对齐

SimpleITK 图像对齐

时间:2023-07-13 14:25:19浏览次数:40  
标签:dcm img 图像 seg sitk SimpleITK file new 对齐

1、使用SimpleITK对齐图像
在看voxelmorph的代码,看到图像对齐部分,记录一下。
下面是从voxelmorph项目中截取的一段保存图像的函数。
函数输入分别是:配准后的图像、固定图像、要将配准图像保存的名字。
将图像对齐的操作需要将对齐的图像的原点、方向、间距设置成与 被对齐的图像一致。

1 def save_image(img, ref_img, name):
2     img = sitk.GetImageFromArray(img[0, 0, ...].cpu().detach().numpy())
3     img.SetOrigin(ref_img.GetOrigin())
4     img.SetDirection(ref_img.GetDirection())
5     img.SetSpacing(ref_img.GetSpacing())
6     sitk.WriteImage(img, os.path.join(args.result_dir, name))

这里只是做了属性的修改,并没有真正的对齐。

2、重采样并对齐图像

 1 def align_seg_with_raw_nrrd(dcm, seg):
 2     # Just for labelmap .... because of nearestNeighour interpolator
 3     resampler = sitk.ResampleImageFilter()
 4     resampler.SetReferenceImage(dcm)
 5     resampler.SetTransform(sitk.Transform(3, sitk.sitkIdentity))
 6     resampler.SetInterpolator(sitk.sitkNearestNeighbor)
 7     seg_new = resampler.Execute(seg)
 8     return seg_new
 9 
10 if __name__ == '__main__':
11     raw_dcm_file = r"path to your nrrd raw data"
12     seg_dcm_file= r"path to your seg file"
13     dcm = sitk.ReadImage(raw_dcm_file)
14     seg = sitk.ReadImage(seg_dcm_file)
15     print(raw_dcm_file, seg_new_file)
16     seg_new = align_seg_with_raw_nrrd(dcm, seg)

我要实现的目的是:将原始stl切下与原始数据重合的部分,并且用一个与原始数据一样的尺寸存放,并且对应的空间坐标一致(原点、spacing、direction)。

如下输入原始数据:

 原始的stl数据,绿色部分:

 对齐后的效果如下:
stl对齐后的volume信息如下

 对齐后的渲染效果如下

3、中间走过的弯路

多设置参数,得到错误的结果。

4、尺寸不一致时改变方向并对齐

  1 # -*- coding : UTF-8 -*-
  2 # @file   : resample_seg.py
  3 # @Time   : 2021/10/14 0014 19:58
  4 # @Author : wmz
  5 
  6 import os
  7 import SimpleITK as sitk
  8 from glob import glob
  9 import numpy as np
 10 
 11 
 12 def chnm_stdraw2seglabel(stdrawfile):
 13     seglabelfile = stdrawfile
 14     seglabelfile = seglabelfile.replace("_knee", "")
 15     if right_flag:
 16         if femur_flag:
 17             seglabelfile = 'Seg_' + seglabelfile[:-5] + '_femur_right.nrrd'
 18         else:
 19             seglabelfile = 'Seg_' + seglabelfile[:-5] + '_hip_right.nrrd'
 20     else:
 21         if femur_flag:
 22             seglabelfile = 'Seg_' + seglabelfile[:-5] + '_femur_left.nrrd'
 23         else:
 24             seglabelfile = 'Seg_' + seglabelfile[:-5] + '_hip_left.nrrd'
 25     return seglabelfile
 26 
 27 
 28 def align_seg_with_raw_dcm(dcm, seg):
 29     # Just for labelmap .... because of nearestNeighour interpolator
 30     # 读取文件的size和spacing信息
 31     outsize = [0, 0, 0]
 32     inputsize = seg.GetSize()
 33     inputspacing = seg.GetSpacing()
 34     input_origin = seg.GetOrigin()
 35     dcm_size = dcm.GetSize()
 36     dcm_spacing = dcm.GetSpacing()
 37     dcm_origin = dcm.GetOrigin()
 38     direction = dcm.GetDirection()
 39     seg_direction = seg.GetDirection()
 40 
 41     transform = sitk.Transform()
 42     transform.SetIdentity()
 43     # 计算改变spacing后的size,用物理尺寸/体素的大小
 44     outsize[0] = round(inputsize[0] * inputspacing[0] / dcm_spacing[0])
 45     outsize[1] = round(inputsize[1] * inputspacing[1] / dcm_spacing[1])
 46     # outsize[2] = round(inputsize[2] * inputspacing[2] / dcm_spacing[2]) # 原大尺寸,弃用
 47     outsize[2] = round((dcm_size[2] + dcm_origin[2] - input_origin[2])/dcm_spacing[2])
 48 
 49     resampler = sitk.ResampleImageFilter()
 50     resampler.SetReferenceImage(dcm)
 51     resampler.SetTransform(sitk.Transform(3, sitk.sitkIdentity))
 52     resampler.SetInterpolator(sitk.sitkNearestNeighbor)
 53     resampler.SetOutputOrigin(seg.GetOrigin())
 54     resampler.SetOutputSpacing(dcm.GetSpacing())
 55     resampler.SetOutputDirection(seg.GetDirection())
 56     resampler.SetSize(outsize)
 57     seg_new = resampler.Execute(seg)
 58     return seg_new
 59 
 60 
 61 def align_label2stdraw(stdrawfile, labelfile):
 62     std_img = sitk.ReadImage(stdrawfile)
 63     std_img_size = std_img.GetSize()
 64     std_img_direction = std_img.GetDirection()
 65     label_img = sitk.ReadImage(labelfile)
 66     new_seg = align_seg_with_raw_dcm(std_img, label_img)
 67     new_seg_origin = new_seg.GetOrigin()
 68     new_seg_direct = new_seg.GetDirection()
 69     new_seg_spacing = new_seg.GetSpacing()
 70     new_seg_size = new_seg.GetSize()
 71     new_seg_data = sitk.GetArrayFromImage(new_seg)
 72     new_seg_data = np.flip(new_seg_data, 1)
 73     new_seg_data = np.flip(new_seg_data, 2)
 74     stdlabel_img = sitk.GetImageFromArray(new_seg_data)
 75     flip_seg_origin = [new_seg_origin[0] + new_seg_direct[0]*new_seg_spacing[0]*new_seg_size[0],
 76                        new_seg_origin[1] + new_seg_direct[4]*new_seg_spacing[1]*new_seg_size[1], new_seg_origin[2]]
 77     stdlabel_img.SetOrigin(flip_seg_origin)
 78     stdlabel_img.SetSpacing(new_seg_spacing)
 79     stdlabel_img.SetDirection(std_img_direction)
 80 
 81     name = labelfile.split("\\")[-1]
 82     sitk.WriteImage(stdlabel_img, os.path.join(dst_dir, name))
 83 
 84 
 85 if __name__ == '__main__':
 86     std_full_dir = r'F:\dataset\align_data\std_raw'
 87     label_dir = r"F:\dataset\align_data\Seg_volume"
 88     dst_dir = r"F:\dataset\align_data\output"
 89     right_flag = True
 90     femur_flag = False
 91 
 92     files = glob(std_full_dir + '/*.nrrd')
 93     for indx, file in enumerate(files):
 94         print("processing", indx+1, "of", len(files))
 95         print("processing file:", file)
 96         # file = r"D:\Work\Data\Patient_Data\train_data\knee_femur\left\NanFang_03021_knee.nrrd"
 97         std_raw_file = file.split('\\')[-1]
 98         seg_label_file = chnm_stdraw2seglabel(std_raw_file)
 99         org_label = os.path.join(label_dir, seg_label_file)
100         if not os.path.exists(org_label):
101             print(org_label, "file not exist !")
102             continue
103         align_label2stdraw(file, org_label)

关键部分是下面这几句:

1      new_seg_data = np.flip(new_seg_data, 1)
2     new_seg_data = np.flip(new_seg_data, 2)
3     stdlabel_img = sitk.GetImageFromArray(new_seg_data)
4     flip_seg_origin = [new_seg_origin[0] + new_seg_direct[0]*new_seg_spacing[0]*new_seg_size[0],
5                        new_seg_origin[1] + new_seg_direct[4]*new_seg_spacing[1]*new_seg_size[1], new_seg_origin[2]]
6     stdlabel_img.SetOrigin(flip_seg_origin)
7     stdlabel_img.SetSpacing(new_seg_spacing)
8     stdlabel_img.SetDirection(std_img_direction)

 

标签:dcm,img,图像,seg,sitk,SimpleITK,file,new,对齐
From: https://www.cnblogs.com/ybqjymy/p/17550309.html

相关文章

  • SimpleITK 读写nii.gz文件
    1、读写nii.gz文件1##usingsimpleITKtoloadandsavedata.2importSimpleITKassitk3itk_img=sitk.ReadImage('./nifti.nii.gz')4img=sitk.GetArrayFromImage(itk_img)5print("imgshape:",img.shape)67##save8out=si......
  • SimpleITK 三维图像分析
    1、去除3D小连通域在一些计算机视觉任务中,需要对模型的输出做一些后处理以优化视觉效果,连通域就是一种常见的后处理方式。尤其对于分割任务,有时的输出mask会存在一些假阳(小的无用轮廓),通过3D连通域找出面积较小的独立轮廓并去除可以有效地提升视觉效果。二维图像连通域一......
  • SimpleITK 简单使用
    SimpleITKITK是一个开源、跨平台的框架,提供给开发者增强功能的图像分析和处理套件(推荐使用)。Note:注意SimpleITK不支持中文,即路径中不能有中文X射线图像对应的读取1#@file:itk_p1.py2#@Time:2021/8/2816:273#@Author:wmz4importSimpleITKassitk......
  • VTK 生成MIP图像-vtkImageSlabReslice类
    MIPMIP(Maximum/MinimumIntensityProjection),最大/最小密度投影重建。MIP可以较真实地反应组织密度差异,使得血管的异常改变、形态、走形强化;但是只适用于外观形态的显示。在容积扫描数据中对每条径线上每个像素的最大强度值进行编码并投射成像。MIP的灰阶度反映CT值的......
  • iOS MachineLearning 系列(3)—— 静态图像分析之区域识别
    iOSMachineLearning系列(3)——静态图像分析之区域识别本系列的前一篇文章介绍了如何使用iOS中自带的API对图片中的矩形区域进行分析。在图像静态分析方面,矩形区域分析是非常基础的部分。API还提供了更多面向应用的分析能力,如文本区域分析,条形码二维码的分析,人脸区域分析,人体分析......
  • PyQt,PySide2中嵌入Matplotlib图像
    PyQt,PySide2中嵌入Matplotlib图像方式1使用QtDesigner新建一个MainWindow,在此之上创建一个VerticalLayout。importsysimportnumpyasnpfromPySide2.QtUiToolsimportQUiLoaderfromPySide2.QtWidgetsimportQApplicationimportmatplotlibmatplotlib.use("Qt5......
  • 高速图像采集卡:基于TI DSP TMS320C6678、Xilinx K7 FPGA XC7K325T的高速数据处理核心
    基于TIDSPTMS320C6678、XilinxK7FPGAXC7K325T的高速数据处理核心板一、板卡概述该DSP+FPGA高速信号采集处理板由北京太速科技自主研发,包含一片TIDSPTMS320C6678和一片XilinxFPGAK7XC72K325T-1ffg900。包含1个千兆网口,1个FMCHPC接口。可搭配使用ADFM......
  • Topaz DeNoise AI mac版(AI智能图像降噪工具)
    TopazDeNoiseAI是一款基于人工智能技术的图像降噪工具,能够帮助用户快速高效地去除图像中的噪点和杂色,提升图像的清晰度和细节。该软件采用了最新的深度学习算法,能够自动识别并去除各种类型的噪点,包括色斑、颗粒、条纹等,同时还能够保持图像的细节和色彩饱和度,避免出现过度平滑的......
  • NV21、NV12、YV12、RGB、YUV、RGBA、RGBX8888等图像色彩编码格式区别
    常用图像颜色编码格式NV21、NV12、YV12、RGB、YUV、RGBA、RGBX8888都是常见的图像颜色编码格式,它们之间的主要区别在于色彩空间和数据排列方式。NV21:NV21是Android系统使用的一种图像颜色编码格式,它采用的是YUV4:2:0的采样方式,意味着垂直方向上每两个像素采样一次,水平方向上每个像......
  • DxO ViewPoint-专业图像校正软件 mac/win版
    DxOViewPoint是一款专业的图像校正软件,为摄影师和设计师提供了强大的工具和功能,帮助他们纠正各种透视畸变和几何变形,使图像更加直观和准确。→→↓↓载DxOViewPointmac/win版 透视校正:DxOViewPoint可以有效校正由于摄影角度或镜头失真引起的透视畸变。它提供了多种透视......