医学影像中的基础知识

1.Hounsfield单位
      不同密度的组织具有不同的衰减系数,CT诊断中为了对不同组织进行区分,将不同密度的各种组织用不同的CT值表示,称为Hounsfield单位(Hu)。
      以水为0,空气为-1 000,致密骨为+1 000,这样CT将测得的信号高度精确地数字化,具有了很高的空间和密度分辨力。
在这里插入图片描述
      CT扫描图是包含了所有组织的,如果直接去看,看不到任何有用信息。需要做一些预处理,预处理中一个重要的概念是放射剂量,衡量单位为HU(Hounsfield Unit)。
Hounsfield Unit = pixel_value * rescale_slope + rescale_intercept
      一般情况rescale slope = 1, intercept = -1024。

      上表中肺部组织的HU数值为-500,但通常是大于这个值,比如-320、-400。挑选出这些区域,然后做其他变换抽取出肺部像素点。
2.Python实例 分割路径和文件名
import os.path

常用函数有三种:分隔路径,找出文件名.找出盘符(windows系统),找出文件的扩展名.

根据你机器的实际情况修改下面参数.

spath = " D:/download/repository.7z "

case 1:

p,f = os.path.split(spath);
print ( " dir is: " + p)
print ( " file is: " + f)

case 2:

drv,left = os.path.splitdrive(spath);
print ( " driver is: " + drv)
print ( " left is: " + left)

case 3:

f,ext = os.path.splitext(spath);
print ( " f is: " + f)
print ( " ext is: " + ext)
‘’’
知识点: 这三个函数都返回二元组.
* case1 分隔目录和文件名
* case2 分隔盘符和文件名
* case3 分隔文件和扩展名
‘’’

在医学图像上经常使用的一个库-SimpleITK,很多处理都只懂个大概或者只会简单的读取,保存图像,这里对常用的一些操作进行总结:
import  SimpleITK as sitk 

1、sitk.Cast(sitk.ReadImage(),sitk.sitkFloat32) 图像转换数据类型
2、sitk.ReadImage(图像路径)读取图像,如.mhd .nii .nrrd等
3、sitk.WriteImage(image,图像路径)保存图像
4、sitk.GetArrayFromImage(sitk.ReadImage
5、sitk.GetImageFromArray() 将数组转换成sitk图像
6、rescalFilt = sitk.RescaleIntensityImageFilter() 改变图像的像素值,转换为[0255]
      rescalFilt.SetOutputMaximum(255)
      rescalFilt.SetOutputMinimum(0)
      itkimage = rescalFilt.Execute(sitk.ReadImage()
7、resampler = sitk.ResampleImageFilter() 图像重采样
     resampler.SetReferenceImage(itkimage)#需要重新采样的目标图像
     resampler.SetSize(newSize.tolist())
     resampler.SetTransform(sitk.Transform(3, sitk.sitkIdentity))
     resampler.SetInterpolator(sitk.sitkNearestNeighbor)
     itkimgResampled = resampler.Execute(itkimage)#得到重新采样后的图像
8、sitk.Threshold(sitk.ReadImage(), 0, 1.0, 255) 将图像中像素值<0>1.0的像素值改为255,否则保持不变 
9、sitk.BinaryThreshold(sitk_src, lowerThreshold=lowervalue, upperThreshold=uppervalue, insideValue=255, outsideValue=0) 图像二值化
10、image1 = sitk.ReadImage() 对sitk的image1处理完后恢复到世界坐标系
      image2 = sitk.GetArrayFromImage(image1)
      origin =  image1.GetOrigin()
      spacing = image1.GetSpacing()
      direction = image1.GetDirection()
      image2 = sitk.GetImageFromArray(image2)
      image2.SetOrigin(origin)
      image2.SetSpacing(spacing)
      image2.SetDirection(direction)
11、sitk_src_gaus = sitk.DiscreteGaussianImageFilter() 图像高斯滤波
        sitk_src_gaus.SetVariance(3)
        sitk_src_gaus.SetMaximumError(0.2)
        sitk_src_gaus = sitk_src_gaus.Execute(sitk.ReadImage())
12、sitk.BinaryMorphologicalOpening(sitk.ReadImage() != 0, kernelsize) 图像的形态学操作:开、闭、膨胀、腐蚀
        sitk.BinaryMorphologicalClosing(sitk.ReadImage() != 0, kernelsize)
        sitk.BinaryDilate(sitk.ReadImage() != 0, kernelsize)
        sitk.BinaryErode(sitk.ReadImage() != 0, kernelsize)
13、sitk_xorop = sitk.XorImageFilter() 图像的逻辑运算:异或、非
        sitk_mask1 = sitk_xorop.Execute(imag1, imag2) image1和image2是sitk图像的二值化结果
        sitk_notop = sitk.NotImageFilter()
        sitk_mask2 = sitk_notop.Execute(image) image是sitk图像的二值化结果
14、sitk.BinaryFillhole(sitk的二值化图像)去除二值化图像内的孔洞

dicom文件:
      dicom是一个存储患者所拍摄医学影像的某一层断面图和相关信息的文件。
mhd文件与raw文件的区别:
      Raw文件,意为“未处理的文件”,其保存的是纯像素信息。常常是一个病人的所有dicom文件中的图像提取出来放在一个raw文件里。也就是说,一个病人对应一个raw文件,其中存储的是该病人的图像信息。(可以理解为将该病人不同的dicom切片图像都叠到一起,形成了一个三维图像)。一个raw通常有几百兆,对应的mhd文件只有1kb。mhd文件需要借助python的SimpleITK包来处理。
      上面已经提到,dicom文件除了包含切片图像外,还包含其他的一些信息。那么在文件格式转换后,图像信息被raw文件提取,非图像信息则存储在mhd头文件中。简单来说,mhd头文件是存储关于一个病人的所有dicom文件中的非图像信息。
      由上述关系可以知道:raw文件与mhd文件是一一对应的,且它们的数量小于等于(实际中一定是小于)dicom文件数量

      因为DICOM图像通常是一个序列,普通的dcm格式的图像序列可以直接使用DICOM图像查看软件打开进行查看;但mhd格式的3D图像却无法方便地查看。

  File "D:/RStudio/data/TumorType-WGS-master/CT_MHD/Mhd_Visualization.py", line 12, in <module>
    im = cv2.cvtColor(im, cv2.COLOR_GRAY2RGB)
cv2.error: OpenCV(4.4.0) c:\users\appveyor\appdata\local\temp\1\pip-req-build-iw3y3ir8\opencv\modules\imgproc\src\color.simd_helpers.hpp:94: error: (-2:Unspecified error) in function '__cdecl cv::impl::`anonymous-namespace'::CvtHelper<struct cv::impl::`anonymous namespace'::Set<1,-1,-1>,struct cv::impl::A0x4107568d::Set<3,4,-1>,struct cv::impl::A0x4107568d::Set<0,2,5>,2>::CvtHelper(const class cv::_InputArray &,const class cv::_OutputArray &,int)'
> Unsupported depth of input image:
>     'VDepth::contains(depth)'
> where
>     'depth' is 3 (CV_16S)

参考该链接:https://blog.csdn.net/rocking_struggling/article/details/104825407

Dicom文件转mhd,raw文件格式
https://www.cnblogs.com/XDU-Lakers/p/10781321.html

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值