将 Cloud Healthcare API 用于数字病理

本页面介绍了如何使用 Cloud Healthcare API 存储、分析和管理完整幻灯片图片 (WSI)。

概览

借助数字病理,您可以通过将传统玻璃幻灯片进行数字化处理以产生完整幻灯片图片 (WSI),以便存储、处理和管理传统幻灯片。

WSI 通常是较大的文件,最大可达数个 GB。它们支持各种文件格式,因此难以管理。Cloud Healthcare API 简化了 WSI 的存储、分析和管理过程。

使用 DICOM 存储完整幻灯片图片

Cloud Healthcare API 提供用于存储 DICOM 图片的托管式服务。此服务还支持存储和检索 WSI。如需详细了解 Cloud Healthcare API 中的 DICOM,请参阅 DICOM

使用 DICOM 具有以下优点:

  • 支持多个供应商和软件。
  • DICOM 是文件格式,也是定义 DICOMweb 和 DIMSE API 的网络协议。这些 API 用于检索和存储 DICOM 实例,它们提供大量功能并简化与图片的交互。

将完整幻灯片图片转换为 DICOM

大多数 WSI 扫描程序都不会以原生方式从 WSI 生成 DICOM 文件。因此,您必须手动将 WSI 转换为 DICOM 文件。

以下工具可将 WSI 转换为 DICOM:

以下部分介绍了如何使用 wsi2dcm 命令行工具生成 DICOM 文件。

使用 wsi2dcm 命令行工具生成 DICOM 文件

在完成以下步骤之前,请确保拥有有效的 WSI 文件。OpenSlideDigital Pathology Associate 网站列出的其他资源中提供了示例数据。

运行 wsi2dcm 命令行工具:

wsi2dcm \
    --input=INPUT_WSI \
    --outFolder=PATH/TO/OUTPUT/FOLDER \
    --seriesDescription=WSI_DESCRIPTION

其中:

  • INPUT_WSI 是 WSI 文件的路径和名称。
  • PATH/TO/OUTPUT/FOLDER 是该工具输出已转换 DICOM 文件的路径。
  • WSI_DESCRIPTION 是您为转换后的 DICOM 文件选择的说明。

运行该工具会从 WSI 生成多个 DICOM 文件。DICOM 文件的后缀为 .dcm

将 DICOM 文件上传到 Cloud Healthcare API

如果尚未创建 DICOM 存储区,请立即创建一个。

您可以使用以下任一方法在 DICOM 存储区中上传生成的 DICOM 文件:

检索 DICOM 文件及其元数据

将 DICOM 文件上传到 DICOM 存储区后,您可以列出和查看有关 DICOM 图片的元数据。

列出完整幻灯片图片

每个 WSI 都是一项 DICOM 研究。要列出 WSI,您可以调用 dicomStores.searchForStudies 方法:

curl

要在 DICOM 存储区中搜索研究,请发出 GET 请求并指定以下信息:

  • 父数据集的名称
  • DICOM 存储区的名称
  • 访问令牌

以下示例展示了使用 curlGET 请求。

curl -X GET \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID/dicomWeb/studies"

如果请求成功,服务器将以 JSON 格式返回响应:

[
  {
    "0020000D": {
      "vr": "UI",
      "Value": [
        "STUDY_INSTANCE_UID"
      ]
    }
  },
  {
    "00080005": {
      "vr": "CS",
      "Value": [
        "SPECIFIC_CHARACTER_SET"
      ]
    },
    "00080020": {
      "vr": "DA",
      "Value": [
        "STUDY_DATE"
      ]
    },
    "00080030": {
      "vr": "TM"
    },
    "00080050": {
      "vr": "SH",
      "Value": [
        "ACCESSION_NUMBER"
      ]
    },
    "00080090": {
      "vr": "PN"
    },
    "00100010": {
      "vr": "PN"
    },
    "00100020": {
      "vr": "LO",
      "Value": [
        "PATIENT_ID"
      ]
    },
    "00100030": {
      "vr": "DA"
    },
    "00100040": {
      "vr": "CS"
    },
    "0020000D": {
      "vr": "UI",
      "Value": [
        "STUDY_INSTANCE_UID"
      ]
    },
    "00200010": {
      "vr": "SH"
    }
  }
]

PowerShell

要在 DICOM 存储区中搜索研究,请发出 GET 请求并指定以下信息:

  • 父数据集的名称
  • DICOM 存储区的名称
  • 访问令牌

以下示例展示了使用 Windows PowerShell 的 GET 请求。

$cred = gcloud auth application-default print-access-token
$headers = @{ Authorization = "Bearer $cred" }

Invoke-RestMethod `
  -Method Get `
  -Headers $headers `
  -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID/dicomWeb/studies"

如果请求成功,服务器将以 JSON 格式返回响应:

[
  {
    "0020000D": {
      "vr": "UI",
      "Value": [
        "STUDY_INSTANCE_UID"
      ]
    }
  },
  {
    "00080005": {
      "vr": "CS",
      "Value": [
        "SPECIFIC_CHARACTER_SET"
      ]
    },
    "00080020": {
      "vr": "DA",
      "Value": [
        "STUDY_DATE"
      ]
    },
    "00080030": {
      "vr": "TM"
    },
    "00080050": {
      "vr": "SH",
      "Value": [
        "ACCESSION_NUMBER"
      ]
    },
    "00080090": {
      "vr": "PN"
    },
    "00100010": {
      "vr": "PN"
    },
    "00100020": {
      "vr": "LO",
      "Value": [
        "PATIENT_ID"
      ]
    },
    "00100030": {
      "vr": "DA"
    },
    "00100040": {
      "vr": "CS"
    },
    "0020000D": {
      "vr": "UI",
      "Value": [
        "STUDY_INSTANCE_UID"
      ]
    },
    "00200010": {
      "vr": "SH"
    }
  }
]

查看完整幻灯片图片元数据

每个研究包含多个实例,而每个实例包含一部分 WSI 图块。要在研究中查看实例的实例元数据,请调用 dicomStores.searchForInstances 方法:

curl

要在研究中查看实例的实例元数据,请发出 GET 请求并指定以下信息:

  • 父数据集的名称
  • DICOM 存储区的名称
  • 研究实例唯一标识符 (UID)
  • 访问令牌

以下示例展示了使用 curlGET 请求。

curl -X GET \
     -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
     "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID/dicomWeb/instances?StudyInstanceUID=STUDY_INSTANCE_UID"

如果请求成功,服务器将以 JSON 格式返回响应:

[
  {
    "00080005": {
      "vr": "CS",
      "Value": [
        "SPECIFIC_CHARACTER_SET"
      ]
    },
    "00080016": {
      "vr": "UI",
      "Value": [
        "SOP_CLASS_UID"
      ]
    },
    "00080018": {
      "vr": "UI",
      "Value": [
        "SOP_INSTANCE_UID"
      ]
    },
    "00080020": {
      "vr": "DA",
      "Value": [
        "STUDY_DATE"
      ]
    },
    "00080030": {
      "vr": "TM"
    },
    "00080050": {
      "vr": "SH",
      "Value": [
        "ACCESSION_NUMBER"
      ]
    },
    "00080060": {
      "vr": "CS",
      "Value": [
        "MODALITY"
      ]
    },
    "00080090": {
      "vr": "PN"
    },
    "00100010": {
      "vr": "PN"
    },
    "00100020": {
      "vr": "LO",
      "Value": [
        "PATIENT_ID"
      ]
    },
    "00100030": {
      "vr": "DA"
    },
    "00100040": {
      "vr": "CS"
    },
    "0020000D": {
      "vr": "UI",
      "Value": [
        "STUDY_INSTANCE_UID"
      ]
    },
    "0020000E": {
      "vr": "UI",
      "Value": [
        "SERIES_INSTANCE_UID"
      ]
    },
    "00200010": {
      "vr": "SH"
    },
    "00200013": {
      "vr": "IS",
      "Value": [
        INSTANCE_NUMBER
      ]
    },
    "00280010": {
      "vr": "US",
      "Value": [
        ROWS
      ]
    },
    "00280011": {
      "vr": "US",
      "Value": [
        COLUMNS
      ]
    },
    "00280100": {
      "vr": "US",
      "Value": [
        BITS_ALLOCATED
      ]
    },
    "00400244": {
      "vr": "DA",
      "Value": [
        "PERFORMED_PROCEDURE_STEP_START_DATE"
      ]
    }
  },
...
]

PowerShell

要查看研究中所有实例的实例元数据,请发出 GET 请求并指定以下信息:

  • 父数据集的名称
  • DICOM 存储区的名称
  • 研究实例 UID
  • 访问令牌

以下示例展示了使用 Windows PowerShell 的 GET 请求。

$cred = gcloud auth application-default print-access-token
$headers = @{ Authorization = "Bearer $cred" }

Invoke-RestMethod `
  -Method Get `
  -Headers $headers `
  -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID/dicomWeb/instances?StudyInstanceUID=STUDY_INSTANCE_UID"

如果请求成功,服务器将以 JSON 格式返回响应:

[
  {
    "00080005": {
      "vr": "CS",
      "Value": [
        "SPECIFIC_CHARACTER_SET"
      ]
    },
    "00080016": {
      "vr": "UI",
      "Value": [
        "SOP_CLASS_UID"
      ]
    },
    "00080018": {
      "vr": "UI",
      "Value": [
        "SOP_INSTANCE_UID"
      ]
    },
    "00080020": {
      "vr": "DA",
      "Value": [
        "STUDY_DATE"
      ]
    },
    "00080030": {
      "vr": "TM"
    },
    "00080050": {
      "vr": "SH",
      "Value": [
        "ACCESSION_NUMBER"
      ]
    },
    "00080060": {
      "vr": "CS",
      "Value": [
        "MODALITY"
      ]
    },
    "00080090": {
      "vr": "PN"
    },
    "00100010": {
      "vr": "PN"
    },
    "00100020": {
      "vr": "LO",
      "Value": [
        "PATIENT_ID"
      ]
    },
    "00100030": {
      "vr": "DA"
    },
    "00100040": {
      "vr": "CS"
    },
    "0020000D": {
      "vr": "UI",
      "Value": [
        "STUDY_INSTANCE_UID"
      ]
    },
    "0020000E": {
      "vr": "UI",
      "Value": [
        "SERIES_INSTANCE_UID"
      ]
    },
    "00200010": {
      "vr": "SH"
    },
    "00200013": {
      "vr": "IS",
      "Value": [
        INSTANCE_NUMBER
      ]
    },
    "00280010": {
      "vr": "US",
      "Value": [
        ROWS
      ]
    },
    "00280011": {
      "vr": "US",
      "Value": [
        COLUMNS
      ]
    },
    "00280100": {
      "vr": "US",
      "Value": [
        BITS_ALLOCATED
      ]
    },
    "00400244": {
      "vr": "DA",
      "Value": [
        "PERFORMED_PROCEDURE_STEP_START_DATE"
      ]
    }
  },
...
]

查看完整幻灯片图片图块

每个实例通常包含多个帧。帧表示 WSI “pyramid”中特定缩放级别的一个 WSI 图块。要检索单个 JPEG 格式的帧,请调用 frames.retrieveRendered 方法:

curl

要检索单个 JPEG 格式的帧,请发出 GET 请求并指定以下信息:

  • 父数据集的名称
  • DICOM 存储区的名称
  • 研究 UID
  • 系列 UID
  • 实例 UID
  • 访问令牌

以下示例展示了使用 curlGET 请求。

curl -X GET \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Accept: image/jpeg" \
    --output FILENAME \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID/dicomWeb/studies/STUDY_UID/series/SERIES_UID/instances/INSTANCE_UID/frames/0/rendered"

如果请求成功,系统会将该 JPEG 文件写入您的计算机。

PowerShell

要检索单个 JPEG 格式的帧,请发出 GET 请求并指定以下信息:

  • 父数据集的名称
  • DICOM 存储区的名称
  • 研究 UID
  • 系列 UID
  • 实例 UID
  • 访问令牌

以下示例展示了使用 Windows PowerShell 的 GET 请求。

$cred = gcloud auth application-default print-access-token
$headers = @{ Authorization = "Bearer $cred"; "Accept" = "image/jpeg" }

Invoke-RestMethod `
  -Method Get `
  -Headers $headers `
  -OutFile FILENAME `
  -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID/dicomWeb/studies/STUDY_UID/series/SERIES_UID/instances/INSTANCE_UID/frames/0/rendered"

如果请求成功,系统会将该 JPEG 文件写入您的计算机。

检索所有完整幻灯片图片

要检索包含 WSI 的整个实例,请使用 instances.retrieveInstance 方法:

curl

要检索整个实例,请发出 GET 请求并指定以下信息:

  • 父数据集的名称
  • DICOM 存储区的名称
  • 研究 UID
  • 系列 UID
  • 实例 UID
  • 访问令牌

以下示例展示了使用 curlGET 请求。

curl -X GET \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    -H "Accept: application/dicom" \
    --output FILENAME \
    "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID/dicomWeb/studies/STUDY_UID/series/SERIES_UID/instances/INSTANCE_UID"

如果请求成功,系统会将 DICOM 文件写入您的机器。

PowerShell

要检索整个实例,请发出 GET 请求并指定以下信息:

  • 父数据集的名称
  • DICOM 存储区的名称
  • 研究 UID
  • 系列 UID
  • 实例 UID
  • 访问令牌

以下示例展示了使用 Windows PowerShell 的 GET 请求。

$cred = gcloud auth application-default print-access-token
$headers = @{ Authorization = "Bearer $cred"; "Accept" = "application/dicom" }

Invoke-RestMethod `
  -Method Get `
  -Headers $headers `
  -OutFile FILENAME `
  -Uri "https://healthcare.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/datasets/DATASET_ID/dicomStores/DICOM_STORE_ID/dicomWeb/studies/STUDY_UID/series/SERIES_UID/instances/INSTANCE_UID"

如果请求成功,系统会将 DICOM 文件写入您的机器。

使用幻灯片图片查看器查看幻灯片

前面的部分介绍了如何查看 WSI 的元数据以及如何检索各个图块。要查看完整 WSI,您需要使用由 DICOMweb 提供支持的 WSI 查看器。

以下查看器与 Cloud Healthcare API 兼容:

使用 DICOMweb WSI 查看器查看转换后的 WSI DICOM 文件

要使用 DICOMweb WSI 查看器查看转换后的 WSI DICOM 文件,请完成以下部分。

下载查看器

下载 DICOMweb WSI 查看器:

git clone https://github.com/GoogleCloudPlatform/dicomweb-wsi-viewer.git

获取客户端密钥

客户端密钥会在用户访问应用时验证用户身份。可将客户端密钥嵌入到 DICOMweb WSI 查看器的源代码中。要获取客户端密钥,请完成以下步骤:

  1. 转到 Google Cloud Console 中的凭据页面。
    转到“凭据”页面

  2. 点击创建凭据并选择 OAuth 客户端 ID

  3. 应用类型下,选择网页应用

  4. 添加您选择的名称

  5. 已获授权的 JavaScript 来源已获授权的重定向 URI 下,输入 http://localhost:8000

  6. 点击创建,然后在显示的 OAuth 客户端窗口中点击确定。复制客户端 ID 以便在下一部分使用。

在查看器中配置客户端密钥

使用您在上一部分获得的客户端 ID 完成以下步骤:

  1. dicomweb-wsi-viewer 目录中,打开 viewer.js 文件。

  2. 替换以下行,使其包含客户端 ID。

    const CLIENT_ID = 'INSERT-YOUR-CLIENT-ID-HERE'
    

    该行应如以下示例所示:

    const CLIENT_ID = 'PROJECT_ID-VALUE.apps.googleusercontent.com';
    
  3. 保存文件。

如果尚未配置 Google Cloud 项目的 OAuth 同意屏幕,请完成以下步骤:

  1. 转到 OAuth 同意屏幕
    转到 OAuth 同意屏幕

  2. 支持电子邮件地址下,选择要显示为公开联系人的电子邮件地址。该电子邮件地址必须是您自己的电子邮件地址或您拥有的某一 Google 群组的电子邮件地址。

  3. 输入您要显示的应用名称

  4. 点击添加范围。在出现的对话框中,输入 https://www.googleapis.com/auth/cloud-healthcare,然后点击添加

  5. 点击保存

如需稍后更改 OAuth 同意屏幕上的信息(例如产品名称或电子邮件地址),请重复上述步骤配置同意屏幕。

如果已配置 Google Cloud 项目的 OAuth 同意屏幕,则需要在添加范围对话框中添加 https://www.googleapis.com/auth/cloud-healthcare

运行 DICOMweb WSI 查看器

  1. dicomweb-wsi-viewer 目录中,运行以下命令:

    python -m SimpleHTTPServer 8000
    
  2. 在运行上一个命令的计算机上导航到 https://localhost:8000

  3. 在界面中,点击登录/授权以访问 OAuth 同意屏幕,并授予访问您的 Google Cloud 项目和 Cloud Healthcare API 资源的查看者权限。