医療画像処理向けに DICOM ファイルをデコードする

View on TensorFlow.org Google Colab で実行 View source on GitHub Download notebook

概要

このチュートリアルでは、TensorFlow IO で tfio.image.decode_dicom_image を使用し、TensorFlow で DICOM ファイルをデコードする方法を説明します。

セットアップと使用方法

DICOM 画像のダウンロード

このチュートリアルでは、NIH Chest X-ray データセットの DICOM 画像を使用します。

NIH Chest X-ray データセットには、100,000 件の匿名化された胸部レントゲン画像が PNG 形式で含まれています。NIH Clinical Center が提供しているデータセットで、こちらのリンクからダウンロードできます。

Google Cloud でも、DICOM バージョンの画像が提供されています。Cloud Storage で入手可能です。

このチュートリアルでは、GitHub リポジトリより、データセットのサンプルファイルをダウンロードします。

注意: データセットの詳細については、次のリファレンスをご覧ください。

  • Xiaosong Wang, Yifan Peng, Le Lu, Zhiyong Lu, Mohammadhadi Bagheri, Ronald Summers, ChestX-ray8: Hospital-scale Chest X-ray Database and Benchmarks on Weakly-Supervised Classification and Localization of Common Thorax Diseases, IEEE CVPR, pp. 3462-3471, 2017
curl -OL https://github.com/tensorflow/io/raw/master/docs/tutorials/dicom/dicom_00000001_000.dcm
ls -l dicom_00000001_000.dcm
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   164    0   164    0     0    340      0 --:--:-- --:--:-- --:--:--   340
100 1024k  100 1024k    0     0   716k      0  0:00:01  0:00:01 --:--:-- 9836k
-rw-rw-r-- 1 kbuilder kokoro 1049332 Feb 13 02:53 dicom_00000001_000.dcm

必要なパッケージをインストールし、ランタイムを再起動する

try:
  # Use the Colab's preinstalled TensorFlow 2.x
  %tensorflow_version 2.x 
except:
  pass
pip install -q tensorflow-io

DICOM 画像をデコードする

import matplotlib.pyplot as plt
import numpy as np

import tensorflow as tf
import tensorflow_io as tfio

image_bytes = tf.io.read_file('dicom_00000001_000.dcm')

image = tfio.image.decode_dicom_image(image_bytes, dtype=tf.uint16)

skipped = tfio.image.decode_dicom_image(image_bytes, on_error='skip', dtype=tf.uint8)

lossy_image = tfio.image.decode_dicom_image(image_bytes, scale='auto', on_error='lossy', dtype=tf.uint8)


fig, axes = plt.subplots(1,2, figsize=(10,10))
axes[0].imshow(np.squeeze(image.numpy()), cmap='gray')
axes[0].set_title('image')
axes[1].imshow(np.squeeze(lossy_image.numpy()), cmap='gray')
axes[1].set_title('lossy image');
Text(0.5, 1.0, 'lossy image')

png