医学nii图像 预处理——图像裁剪 重采样 灰度区域 归一化 修改图像尺寸

这篇具有很好参考价值的文章主要介绍了医学nii图像 预处理——图像裁剪 重采样 灰度区域 归一化 修改图像尺寸。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

鄙人主要研究方向为医学图像配准,在使用CT数据集之前需要对数据进行预处理。
常规预处理步骤:(*代表本代码有)
1.裁剪出ROI区域
目的:减小图像尺寸,减小内存消耗,减小无关信息,可提高实验精度
2.重采样
一般会重采样到各向同性,例如,将图像重采样到每体素代表1
1
1mm实际体积
3.CT转HU,斜率,截距.[CT图像专有,本文代码没写这个]
*4.截取ROI灰度区域
当处理的图像为肺部图像时,也称为截取肺窗,即肺所在灰度范围,常见肺窗[窗宽:900,窗位:-550],宽肺窗[窗宽:1600,窗位:-600]
*5.归一化
目的:防止梯度防炸
6.resize图像尺寸
由算法(有些算法要求输入图片尺寸统一,有些算法则需要保证原图)或电脑性能(显存小,只能缩小图片咯~)决定

直接上代码文章来源地址https://www.toymoban.com/news/detail-531105.html

import nibabel as nib
import numpy as np
import torch

def get_gray_range(image):
    '获取图像信息:最大最小值'
    image = np.reshape(image, (1, image.shape[0] * image.shape[1] * image.shape[2]))
    image_gray_list = image.tolist()[0]
    image_gray_list.sort()  # 默认升序排列灰度值
    point_num = len(image_gray_list)
    min_num = round(point_num * 0.05)
    max_num = round(point_num * 0.95)
    min_gray_value = image_gray_list[min_num]
    max_gray_value = image_gray_list[max_num - 1]

    return min_gray_value, max_gray_value

def resampling_isotropic(data,voxel,spacing=[1, 1, 1]):
    """
    利用上下采样原理,恢复到各向同性
    :param data: 输入图像
    :param spacing: 各向同行或异性,默认为1*1*1
    :return:
    """
    # 获取图像信息:长宽高;
    height, weight, deepth = data.shape

    # 输出图的size
    size_X = int(height*voxel[0]/spacing[0])
    size_Y = int(weight*voxel[1]/spacing[1])
    size_Z = int(deepth*voxel[2]/spacing[2])

    # ndarray转torch;增加两维,目的是可以在"上下采样"中使用三线性插值法
    data = torch.tensor(data).unsqueeze(0).unsqueeze(0)

    # torch转.float32
    data = data.to(torch.float32)

    """
    函数说明:
    torch.nn.functional.interpolate(input, size=None, scale_factor=None, mode='nearest', align_corners=None, recompute_scale_factor=None)
    
    input (Tensor) – the input tensor
    size (int or Tuple[int] or Tuple[int, int] or Tuple[int, int, int]) – output spatial size.
    scale_factor (float or Tuple[float]) – 空间大小的乘数。如果scale_factor是一个tuple,它的长度必须匹配input.dim()。
    mode (str) – algorithm used for upsampling: nearest(Default), linear (3D-only), bilinear, bicubic (4D-only), trilinear (5D-only), area
    align_corners (bool, optional):几何上,我们把输入和输出的像素看作正方形而不是点。默认值:False
    如果设置为True,输入和输出张量将由它们的角像素中心点对齐,并保留角像素的值。
    如果设置为False,则输入和输出张量由它们的角像素的角点对齐,并且插值对边界外值使用边值填充,使得在scale_factor保持不变的情况下,该操作与输入大小无关。
    这只在mode is 'linear', 'bilinear', 'bicubic' or 'trilinear'时才有效果。
    recompute_scale_factor (bool, optional) :重新计算用于插值计算的scale_factor。
    如果为True,则必须传入scale_factor,并使用scale_factor计算输出大小。计算出的输出大小将用于为插值推断新的尺度。
    注意,当scale_factor是浮点数时,由于舍入和精度问题,它可能与重新计算的scale_factor不同。
    如果为False,那么size或scale_factor将直接用于插值。
    """
    data = torch.nn.functional.interpolate(data,
                                            size=[size_X,size_Y,size_Z],
                                            mode='trilinear',
                                            align_corners=False)
    return data[0, 0, :, :, :]

if __name__ == "__main__":
    """
    预处理主程序
    需修改的参数:
    img_name:图片名称
    old_path:数据集旧路径
    new_path:数据集新路径
    """

    img_path = old_path + img_name
    # 打开nii格式
    img = nib.load(img_path)
    img_data = np.asarray(img.dataobj)

    # 把仿射矩阵和头文件都存下来
    img_affine = img.affine
    img_hdr = img.header

    # 获取图像信息:最大最小值
    img_min, img_max = get_gray_range(img_data)

    # 获取图像信息:长宽高;
    height, weight, deepth = img_data.shape

    # 获取图像信息:voxel spacing,
	voxel = [img_hdr['pixdim'][1]]
    voxel.append(img_hdr['pixdim'][2])
    voxel.append(img_hdr['pixdim'][3])

    # 1.裁剪出感兴趣ROI区域,自定义裁剪范围数据
    ROIrange_XYZ=[40,440,20,240,10,130] 
    xmin=ROIrange_XYZ[0]
    xmax=ROIrange_XYZ[1]
    ymin=ROIrange_XYZ[2]
    ymax=ROIrange_XYZ[3]
    zmin=ROIrange_XYZ[4]
    zmax=ROIrange_XYZ[5]
    img_crop = img_data[xmin:xmax,ymin:ymax,zmin:zmax]

    # 2.重采样。可以恢复到各向同性[1,1,1]
    resample_spacing=[1,1,1]
    img_isotropic = resampling_isotropic(data=img_crop,voxel=voxel,spacing=resample_spacing)

    # 修改NIfTI affines
    scaling_affine = np.diag([resample_spacing[0], resample_spacing[1], resample_spacing[2], 1])

    # 3.裁剪出肺窗
    TonalRange=[-1000,-100]
    clamp_min = TonalRange[0] if img_min <= TonalRange[0] else img_min
    clamp_max = TonalRange[1] if img_max >= TonalRange[1] else img_max
    intrange = clamp_max - clamp_min
    img_clamp = torch.clamp(img_isotropic,min=clamp_min,max=clamp_max)

    # 4 归一化处理,灰度范围-》[0,1]
    img_normalize = (img_clamp-clamp_min) / intrange

    # 5 保存为nii格式
    # NiBabel网址 https://nipy.org/nibabel/manual.html
    img_new = nib.Nifti1Image(img_normalize, scaling_affine, img_hdr)
    img_new_path = new_path + img_name
    nib.save(img_new, img_new_path)

到了这里,关于医学nii图像 预处理——图像裁剪 重采样 灰度区域 归一化 修改图像尺寸的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 图像预处理方法

    图像预处理方法

    两个基本的形态学操作是腐 和膨胀。他们 的变体构成了开运算 ,闭运算, 梯度等。 根据卷积核的大小前景的所有像素会腐 掉 变为 0 ,所以前景物体会变小整幅图像的白色区域会减少。 对于去除白噪声很有用 也可以用来断开两个 在一块的物体等。 函数原型: ⚫src: 输入原

    2023年04月11日
    浏览(21)
  • 图像预处理技术与算法

    图像预处理是计算机视觉和图像处理中非常关键的第一步,其目的是为了提高后续算法对原始图像的识别、分析和理解能力。以下是一些主要的图像预处理技术: 1.图像增强: 对比度调整:通过直方图均衡化(Histogram Equalization)等方法改善图像整体或局部的对比度。 伽玛校

    2024年02月20日
    浏览(19)
  • 【第十七届智能车】智能车图像处理(1)-图像预处理

    【第十七届智能车】智能车图像处理(1)-图像预处理

    本博客使用的硬件是逐飞总钻风130°无畸变摄像头,采用的图像分辨率为188*120,主控为CH32V307VCT6,使用DVI接口进行连接。 我们在本次比赛中采用的是头尾车总钻风摄像头+中间车线性CCD的方案。这两个感光部件各有优劣,使用方式和图像处理也大相径庭。这里讨论的是总钻风

    2024年02月08日
    浏览(20)
  • 使用 SKimage 的图像预处理

    使用 SKimage 的图像预处理

    介绍 图像是视觉对象的二维表示,例如照片、绘画或素描。在数字成像中,图像存储为像素值数组,其中每个像素代表图像亮度和颜色的样本。每个像素的颜色可以由一个或多个通道表示,如传统彩色图像中的红色、绿色和蓝色 (RGB) 通道。在本文中,你将学习各种图像预处

    2024年02月03日
    浏览(18)
  • 关于图像分割的预处理 transform

    关于图像分割的预处理 transform

    目录 1. 介绍 2. 关于分割中的 resize 问题 3. 分割的 transform 3.1 随机缩放 RandomResize 3.2 随机水平翻转 RandomHorizontalFlip 3.3 随机竖直翻转 RandomVerticalFlip 3.4 随机裁剪 RandomCrop 3.5 ToTensor 3.6 normalization 3.7 Compose 3.8 中心裁剪 3.9 Resize 缩放 4. 预处理结果可视化 图像分割的预处理不像

    2024年02月04日
    浏览(14)
  • 计算机视觉(2)——图像预处理

    计算机视觉(2)——图像预处理

    二、图像预处理 2.1 介绍  2.2 特征提取方法 2.2.1 直方图 2.2.2 CLAHE 2.2.3 形态学运算 2.2.4 空间域处理及其变换 2.2.5 空间域分析及变换  (1) 均值滤波 (2)中值滤波 (3)高斯滤波 (4) 梯度Prewitt滤波 (5) 梯度Sobel滤波 (6) 梯度Laplacian滤波 (7) 其他滤波  2.2.6 频域分

    2024年02月03日
    浏览(17)
  • 图像预处理 Tricks【1】:Contours

    图像预处理 Tricks【1】:Contours

    轮廓可以简单地理解为连接所有连续点(沿物体边界)的曲线,这些点通常具有相同的颜色或强度。 轮廓在图像分析中具有重要意义,是物体形状分析和对象检测和识别的有用工具,是理解图像语义信息的重要依据。 本文主要介绍了在 opencv 中,一些重要的用于处理物体轮廓

    2024年02月11日
    浏览(15)
  • OpenCV图像预处理常用函数及流程

    OpenCV图像预处理常用函数及流程

    在PyCharm终端中,运行如下命令 由于默认使用的为外网资源,下载速度和稳定性较差,具体看网络状态。如下命令为使用清华镜像下载安装相应的包 在终端中运行命令时,Windows10系统可能会存在如下报错:无法加载激活文件,因此在此系统上禁止运行脚本。此情况是因为win

    2024年02月05日
    浏览(13)
  • 【Computer Vision】图像数据预处理详解

    【Computer Vision】图像数据预处理详解

    活动地址:[CSDN21天学习挑战赛](https://marketing.csdn.net/p/bdabfb52c5d56532133df2adc1a728fd) 作者简介 :在校大学生一枚,华为云享专家,阿里云星级博主,腾云先锋(TDP)成员,云曦智划项目总负责人,全国高等学校计算机教学与产业实践资源建设专家委员会(TIPCC)志愿者,以及编程

    2024年02月06日
    浏览(10)
  • 【CV学习笔记】图像预处理warpaffine

    【CV学习笔记】图像预处理warpaffine

    在学习图像预处理的时候发现,之前用的图像预处理方法一般为 resize和letter box,这两种方法比较低效,后来在手写AI中接触到了warpaffine,只需要一步就能够对图像进行预处理,同时还能很方便的进行cuda加速,于是便记录下来。 欢迎正在学习或者想学的CV的同学进群一起讨论与

    2023年04月08日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包