【CT值与灰度值的总结】 您所在的位置:网站首页 灰度图像的灰度范围和图像深度之间的关系 【CT值与灰度值的总结】

【CT值与灰度值的总结】

2024-07-12 12:20| 来源: 网络整理| 查看: 265

概述

    首先, 我们要理解, CT值和灰度值这两者根本就不是同一个东西, 不要被一些网络上的文章所误解。

接下来, 就要看你具体是要处理哪种格式的文件了, 是DICOM 还是 NIFTI ; 文件格式不同 , 用来做解析的Python 库也就不同,

譬如,要处理DICOM类型的数据, 一般会用 simpleitk, pydicom 库 ; 

而 NIFTI类型的数据更多使用 Nibabel 库, 或者是 simpleitk 也是可以的。

 

https://blog.csdn.net/normol/article/details/88313888

其实无论对于dcm还是nii格式的图片,只要是ct图,就都可以选择将储存的原始数据转化为Hu值,因为Hu值即代表了物体真正的密度。

对于nii格式的图片,经过测试,nibabel, simpleitk常用的api接口,都会自动的进行上述转化过程,即取出来的值已经是Hu了。

(除非专门用nib.load('xx').dataobj.get_unscaled()或者itk.ReadImage('xx').GetPixel(x,y,z)才能取得原始数据)

对于dcm格式的图片,经过测试,simpleitk, pydicom常用的api接口都不会将原始数据自动转化为Hu!!(itk snap软件读入dcm或nii都不会对数据进行scale操作)  

 

下面就以我使用的 NIFTI 格式的文件以及 Nibabel 库为例:

 

01 CT值(HU值)矩阵的获取

使用 nibabel 自带的 load函数读取 xxx. nii.gz 格式的压缩文件, 得到的 shape 和 type 如下

(64, 512, 512) the type of image array is

使用 get_fdata() 将上面这种格式的数组转换为 ndarray 类型的数组, 

然后查看数组当中的值,以及类型(是 dtype 不是 type)

the data format  is  float64 the min value in array is  -1024.0 the max value in array is  2125.0

是一个 -1024——2125 的矩阵, 如果你有一些关于 CT图像相关的知识,你就会知道现在的这个数组,

就是一个由 CT值 ,也就是常说的 HU值所组成的。

 

02  CT值矩阵与 OpenCV

初次接触 CT图像的处理, 得到了这个CT值矩阵之后, 我就使用OpenCV 的 Imshow 来看了一下, 当时并没有发现什么

太大的问题, (这里暂且不提问题所在, 留到后面)

 

在网上看了一些资料后, 我发现还需要对CT值矩阵进行 windowing 操作,

也就是调整 窗宽(window width)和窗位( window level ), 这两者分别对应图像的对比度与亮度。

(详细说明见: )

 

然后我就按照windowing 的方法, 使用numpy.clip 调整了一下我们 CT值矩阵, 

得到了一个新的,经过处理的CT值举证, 然后我又使用 cv2.imshow 来输出, 

然后我便发现,这次的输出和没调整之前的输出是一模一样的, 我又重新调整了一下 windowing 操作的数值, 

然而发现也是毫无效果,只是当你取了较小的值时, 会输出一片黑, 较大的值会输出一片白,仅此而已。

1 为 (512x512x1)的CT 值矩阵 Imshow的图像 

2位 其经过windowing 之后的图像

3, 4 分别为上面说的全白和全黑

12

34

 

困惑的我又试图比较了这两次输出图像的直方图, 这时我发现,这二者的直方图根本就是天差地别,

也就是说他们两个根本不是同一张图像, 只是发生了的改变我观察不到。

 

经过我一番查阅, 问题可能是出在了我直接使用 imshow 输出范围较大的 CT值矩阵。

当你使用OpenCV的时候,对于黑白图像,它存储的是图像的灰度值,存储的形式类似于一个二维数组; 对于彩色图像,它分为三通道存储,三通道对应于RGB。 这里我们着重讨论黑白图像,因为彩色图像相当于它的扩展。 灰度值用0到255间的整数表示,

而对于CT图像,它的像素值的表示比较复杂(这里与其说是像素值不是说是CT值, 即HU值), 从负几千到正几千都有,我们可以使用ITK依次读取CT图像的每个像素值, 并可以将其每个像素值保存在Mat中,但这时通过opencv的imshow函数不能够显示出来, 可以进行适当的处理,将像素值变换到0到255的范围显示出来。  

 

从上面的描述中,我们可以看到不能直接将 CT 值作为传统意义上的像素值进行输出, 而是要经过一个变换,

或者称其为映射 ;

映射的公式如下

def normalization(hu_value, hu_min, hu_max): normal_value = (hu_value - hu_min) / (hu_max - hu_min) return normal_value

也就是说windowing 操作之后, 还要执行一个由 CT值向灰度值的映射, 

 

这里给出我随机给的两组数, 其调试出来的值, 

说明这种方法对于改变亮度 和 对比度都是有效的 , 

具体的值如何给定, 还需要根据你的数据以及任务来看。

 

 

这阶段到此结束, 希望我的分享能够帮到你一点点。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有