▲基本图像处理(利用 python 实现)
图像处理库有很多,但 OpenCV(开源计算机视觉库,open computer vision)凭借其广泛的支持且可用于 C++、java 和 python 的优点而成为主流。而我更偏向于使用 jupyter notebook 导入 OpenCV。
你可以使用 pip install opencv-python,也可以从 opencv.org 网站直接进行安装。
安装 opencv
现在打开 Jupyter notebook 并确认能够导入 cv2。你还需要 numpy 和 matplotlib 库来在 notebook 内查看图片。
现在来检查能否打开并通过键入下述代码在笔记本上查看图像。
通过 OpenCV 进行图像加载的示例
▲基本人脸识别
我们来做点有意思的事情吧,比如人脸识别。我们将使用一种最初由 Rainer Lienhart 开发的正面人脸识别器,它使用了基于开源 xml 残基(stump-based)的 20x20 柔和 adaboost 算法。
关于 Haar-cascade 检测的详细范例:http://docs.opencv.org/trunk/d7/d8b/tutorial_py_face_detection.html
使用 OpenCV 进行人脸识别
在文档区使用 opencv 进行图像处理的例子不胜枚举。
我们已经了解了图像处理的基础,下面来了解医学图像格式吧。
医学图像数据格式
医学图像以数字成像和通信(DICOM)为存储与交换医学图像数据的标准解决方案。该标准的第一版发布于 1985 年,之后有少许修改;它使用了文件格式和通信协议如下。
文件格式:所有患者的医疗图像都以 DICOM 文件格式进行保存。该格式不仅具有与图像相关的数据(如用于捕获图像的设备和医疗处理情境),还具有关于患者的 PHI (受保护的健康信息,protected health information),如姓名、性别、年龄等。医疗影像设备可以创建 DICOM 文件,而医生可以使用 DICOM 查看器以及可显示 DICOM 图像的计算机应用程序来读取并诊断从图像获得的结果。
通信协议:DICOM 通信协议用于搜索档案中的成像研究,并将成像研究恢复到工作站来显示。连接到医院网络的全部医学成像应用程序都使用 DICOM 协议来交换信息,其中大部分信息是 DICOM 图像,但还包括患者和手术信息。此外还有更先进的网络命令用于控制并跟踪治疗、调整进程、报告状态,并在医生和成像设备之间共享工作负载。
现有篇博文很细致地描述了 DICOM 标准,此处为链接:http://dicomiseasy.blogspot.com/
▲分析DICOM文件
Pydicom 是一个 python 包,它很适合分析 DICOM 图像。本节将阐述如何在 Jupyter notebook 上呈现 DICOM 图像。
安装 Pydicom 使用:pip install pydicom。
安装 pydicom 包之后,回到 Jupyter notebook 进行操作。在 notebook 中导入 dicom 包以及其他包,如下所示:
我们也能使用 pandas、scipy、skimage 以及 mpl_toolkit 等其他的包来进行数据处理与分析。
你可以在线获得很多免费的 DICOM 数据集,但下述数据集在入门阶段定能有所帮助:
Kaggle Competitions and Datasets:它是我的最爱。请查阅肺癌竞争和糖尿病视网膜病变的数据:https://www.kaggle.com/c/data-science-bowl-2017/data
Dicom Library:面向教育和科学的 DICOM 库,其提供免费的在线医疗 DICOM 图像或视频文件共享服务。
Osirix Datasets:提供通过各种成像模式获取的大量人类数据集。
Visible Human Datasets:在这里可视化人类计划的一部分数据可以免费利用,这很奇怪,因为获取这些数据既不免费也不轻松。
The Zubal Phantom:该网站免费提供 CT 和 MRI 这两种男性的多个数据集。
请下载 dicom 文件并加载到 jupyter notebook 中。
现在将 DICOM 图像加载到列表中。
第一步:在 Jupyter 中进行 DICOM 图像的基本查看操作
在第一行加载第一个 DICOM 文件来提取元数据,这个文件将赋值为 RefDs,其文件名会列在 lstFilesDCM 列表的顶端。
然后来计算 3D NumPy 数组的总维度,它等于在笛卡尔坐标轴中(每个切片的像素行数*每个切片的像素列数*切片数)。最后,使用 PixelSpacing 和 SliceThickness 属性来计算三个轴之间的像素间距。我们将把数组维度储存在 ConstPixelDims 中,把空间储存在 ConstPixelSpacing [1] 中。
第二步:查看 DICOM 格式的细节
CT 扫描中的测量单位是亨氏单位(Hounsfield Unit,HU),它是辐射强度的度量。CT 扫描仪经过高度校准以精确测量。
每个像素都被分配了一个数值(CT 号),它是包含在相应体素(corresponding voxel)中的所有衰减值的平均数。将这个数字与水的衰减值进行比较,并以任意单位中的亨氏单位(HU)为刻度进行显示。
这个刻度将水的衰减值(HU)标为 0。CT 数量的范围是 2000HU,但一些现代扫描仪具有较高的 HU 范围,最高可达 4000。每个数字表示在光谱的其中一端会出现+1000(白色)和-1000(黑色)的灰色阴影。
一些扫描仪具有圆柱形扫描范围,但其输出图像却是矩形。落在这些边界之外的像素具有-2000 的固定值。
第一步通常是将这些值设置为 0。接着,通过与重新缩放的斜率相乘并添加截距来返回到亨氏单位(斜率和截距均很方便地存储在扫描的元数据中!)。
下部分将会用到 Kaggle 的肺癌数据集,并使用 Keras 卷积神经网络进行建模;它将以上文所提供的的信息为基础。
在上文中,我们介绍了一些使用 OpenCV 进行图像处理的基础知识,以及 DICOM(医学数字影像和通讯)图像基础。下面我们将从卷积神经网络(Convolutional Neural Nets)的视角来谈一谈深度学习基础。在下部分文章里,我们将以 Kaggle 的肺癌数据集为实例,来研究一下在一个肺癌 DICOM 图像中要寻找的关键信息,并使用 Kera 开发出一个预测肺癌的模型。