【CT值与灰度值的总结】 | 您所在的位置:网站首页 › 灰度图像的灰度范围和图像深度之间的关系 › 【CT值与灰度值的总结】 |
概述 首先, 我们要理解, 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 实验室设备网 版权所有 |