首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SimpleITK调整图像大小

SimpleITK调整图像大小
EN

Stack Overflow用户
提问于 2018-01-03 01:13:28
回答 2查看 9.3K关注 0票数 4

我有一套使用SimpleITK阅读的3D卷

代码语言:javascript
复制
import SimpleITK as sitk
for filename in filenames:
    image = sitk.ReadImage(filename)

每个体积都有不同的大小、间距、原点和方向。此代码为不同的图像生成不同的值:

代码语言:javascript
复制
print(image.GetSize())
print(image.GetOrigin())
print(image.GetSpacing())
print(image.GetDirection())

我的问题是:如何将图像转换为相同的大小和间距,以便它们在转换为numpy数组时都具有相同的分辨率和大小。类似于:

代码语言:javascript
复制
import SimpleITK as sitk
for filename in filenames:
    image = sitk.ReadImage(filename)
    image = transform(image, fixed_size, fixed_spacing)
    array = sitk.GetArrayFromImage(image)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-03 02:15:49

方法是使用具有固定/任意大小和间距的重采样函数。下面是一个代码片段,显示了这个"reference_image“空间的构造:

代码语言:javascript
复制
reference_origin = np.zeros(dimension)
reference_direction = np.identity(dimension).flatten()
reference_size = [128]*dimension # Arbitrary sizes, smallest size that yields desired results. 
reference_spacing = [ phys_sz/(sz-1) for sz,phys_sz in zip(reference_size, reference_physical_size) ]

reference_image = sitk.Image(reference_size, data[0].GetPixelIDValue())
reference_image.SetOrigin(reference_origin)
reference_image.SetSpacing(reference_spacing)
reference_image.SetDirection(reference_direction)

对于交钥匙解决方案,请看一下this Jupyter notebook,它演示了如何在SimpleITK中使用可变大小的图像进行数据增强(上面的代码来自notebook)。你也可以从SimpleITK notebook repository of use中找到其他笔记本电脑。

票数 8
EN

Stack Overflow用户

发布于 2020-07-28 01:02:14

根据SimpleITK的文档,图像重采样过程包括4个步骤:

图像图像-我们在坐标system;

  • Resampling格网中重新采样的图像-将映射到坐标system;

  • Transformation的坐标系中给定的点的规则格网-将点从坐标系映射到坐标system;

  • Interpolator -一种用于从

定义的点的值获取坐标系中任意点的强度值的方法

以下代码片段用于对图像进行下采样,以保留其坐标系属性:

代码语言:javascript
复制
def downsamplePatient(patient_CT, resize_factor):

    original_CT = sitk.ReadImage(patient_CT,sitk.sitkInt32)
    dimension = original_CT.GetDimension()
    reference_physical_size = np.zeros(original_CT.GetDimension())
    reference_physical_size[:] = [(sz-1)*spc if sz*spc>mx  else mx for sz,spc,mx in zip(original_CT.GetSize(), original_CT.GetSpacing(), reference_physical_size)]
    
    reference_origin = original_CT.GetOrigin()
    reference_direction = original_CT.GetDirection()

    reference_size = [round(sz/resize_factor) for sz in original_CT.GetSize()] 
    reference_spacing = [ phys_sz/(sz-1) for sz,phys_sz in zip(reference_size, reference_physical_size) ]

    reference_image = sitk.Image(reference_size, original_CT.GetPixelIDValue())
    reference_image.SetOrigin(reference_origin)
    reference_image.SetSpacing(reference_spacing)
    reference_image.SetDirection(reference_direction)

    reference_center = np.array(reference_image.TransformContinuousIndexToPhysicalPoint(np.array(reference_image.GetSize())/2.0))
    
    transform = sitk.AffineTransform(dimension)
    transform.SetMatrix(original_CT.GetDirection())

    transform.SetTranslation(np.array(original_CT.GetOrigin()) - reference_origin)
  
    centering_transform = sitk.TranslationTransform(dimension)
    img_center = np.array(original_CT.TransformContinuousIndexToPhysicalPoint(np.array(original_CT.GetSize())/2.0))
    centering_transform.SetOffset(np.array(transform.GetInverse().TransformPoint(img_center) - reference_center))
    centered_transform = sitk.Transform(transform)
    centered_transform.AddTransform(centering_transform)

    # sitk.Show(sitk.Resample(original_CT, reference_image, centered_transform, sitk.sitkLinear, 0.0))
    
    return sitk.Resample(original_CT, reference_image, centered_transform, sitk.sitkLinear, 0.0)

在脑部CT扫描中使用上面的片段,我们可以得到:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48065117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档