ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

AWS HealthImaging(医学影像)JavaScript SDK v3 代码示例全解析:从 DICOM 导入到图像帧下载

AWS HealthImaging(医学影像)JavaScript SDK v3 代码示例全解析:从 DICOM 导入到图像帧下载 示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载导读本文基于 AWS 官方代码示例仓库中 javascriptv3/example_code/medical-imaging 模块系统讲解如何用 AWS SDK for JavaScript (v3) 操作 AWS HealthImaging——一项符合 HIPAA 合规要求、面向医疗机构与医学影像 ISV 合作伙伴的托管服务用于存储、转换医学影像并对影像数据应用机器学习。读完本文你将掌握 HealthImaging 的 18 个核心 API 调用方式数据仓库、图像集、DICOM 导入、标签管理了解三个开箱即用的实战场景并能在本地复现「DICOM 导入 → 图像帧下载 → 解码校验」的完整工作流。HealthImaging 与 JavaScript SDK v3 概览AWS HealthImaging 是 AWS 提供的一项 HIPAA 合规服务帮助医疗机构及其医学影像 ISV 合作伙伴完成医学影像的存储store、转换transform与应用机器学习apply ML。它内置 DICOMDigital Imaging and Communications in Medicine医学数字影像与通信标准语义层支持以 DICOM 对象模型数据仓库 Datastore、图像集 ImageSet、图像帧 Image Frame管理影像数据。本模块的示例代码全部使用ECMAScript 6ES6编写基于aws-sdk/client-medical-imaging客户端包。核心入口文件如下客户端初始化 libs/medicalImagingClient.js导出单例客户端hello.jsHello 示例ListDatastoresactions/18 个单动作调用示例scenarios/3 个多步骤场景示例仓库的package.json查看依赖声明了三个关键依赖dependencies: { aws-doc-sdk-examples/lib: ^1.0.1, aws-sdk/client-cloudformation: ^3.620.0, aws-sdk/client-medical-imaging: ^3.620.0, aws-sdk/client-sts: ^3.620.0 }其中aws-sdk/client-medical-imaging提供全部 HealthImaging APIaws-sdk/client-cloudformation和aws-sdk/client-sts用于场景示例中的基础设施部署与账号信息获取。⚠ 重要提示运行本仓库代码前必须了解以下事项原文「Important」部分的完整继承运行这些代码可能产生 AWS 费用详见 AWS Pricing 与 Free Tier。运行测试同样可能产生 AWS 费用。建议遵循最低权限原则least privilege至少只授予完成当前任务所需的最小权限参考 Grant least privilege。并非所有 AWS 区域都经过测试使用前请参考 AWS Regional Services 确认区域支持情况。环境准备Prerequisites完整前置条件请参见 javascriptv3 目录下的 README核心要求包括Node.js 环境示例基于 ES6 模块type: module编写建议使用支持 ESM 的 Node.js 版本。AWS 凭据与区域配置本地已配置好 AWS 凭据~/.aws/credentials与默认区域~/.aws/configSDK 会自动读取。安装依赖在 javascriptv3/example_code/medical-imaging 目录下执行包安装并参考package.json中的脚本配置。代码的 ES6 语法与 CommonJS 的转换指南可参考官方文档 JavaScript ES6/CommonJS syntax。初始化客户端所有动作示例共用一个客户端单例libs/medicalImagingClient.jsimport { MedicalImagingClient } from aws-sdk/client-medical-imaging; // 可在 region 属性中显式指定区域留空时 SDK 默认使用本地 AWS config 中的区域 export const medicalImagingClient new MedicalImagingClient();客户端构造时不传任何参数SDK 将自动从本地 AWS 配置region credentials解析。Hello 示例 hello.js 展示了最基本的调用模式——先构造 Command再通过client.send(command)发送import { ListDatastoresCommand, MedicalImagingClient, } from aws-sdk/client-medical-imaging; // 当未提供 region 或 credentials 时SDK 使用本地 AWS config 中的配置 const client new MedicalImagingClient({}); export const helloMedicalImaging async () { const command new ListDatastoresCommand({}); const { datastoreSummaries } await client.send(command); console.log(Datastores: ); console.log(datastoreSummaries.map((item) item.datastoreName).join(\n)); return datastoreSummaries; };这就是最简的「Hello HealthImaging」入门写法列出账号下所有数据仓库名称。单动作示例18 个核心 API 调用模块的 actions/ 目录按 HealthImaging 的资源层次组织了一组单一动作示例每个文件调用一个服务函数可按下表分类数据仓库Datastore管理示例文件调用的 API功能create-datastore.jsCreateDatastore创建数据仓库get-datastore.jsGetDatastore获取数据仓库详情list-datastores.jsListDatastores列出数据仓库delete-datastore.jsDeleteDatastore删除数据仓库创建数据仓库只需传入一个datastoreName参数create-datastore.jsexport const createDatastore async (datastoreName DATASTORE_NAME) { const response await medicalImagingClient.send( new CreateDatastoreCommand({ datastoreName: datastoreName }), ); console.log(response); return response; };成功响应中datastoreStatus为CREATING数据仓库创建是异步的之后可调用 GetDatastore 轮询到ACTIVE{ datastoreId: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, datastoreStatus: CREATING }DICOM 导入任务DICOM Import Job示例文件调用的 API功能start-dicom-import-job.jsStartDICOMImportJob启动 DICOM 导入任务get-dicom-import-job.jsGetDICOMImportJob查询导入任务状态list-dicom-import-jobs.jsListDICOMImportJobs列出导入任务启动导入任务需要 5 个参数start-dicom-import-job.jsexport const startDicomImportJob async ( jobName test-1, datastoreId 12345678901234567890123456789012, dataAccessRoleArn arn:aws:iam::xxxxxxxxxxxx:role/ImportJobDataAccessRole, inputS3Uri s3://medical-imaging-dicom-input/dicom_input/, outputS3Uri s3://medical-imaging-output/job_output/, ) { const response await medicalImagingClient.send( new StartDICOMImportJobCommand({ jobName: jobName, datastoreId: datastoreId, dataAccessRoleArn: dataAccessRoleArn, inputS3Uri: inputS3Uri, outputS3Uri: outputS3Uri, }), ); return response; };各参数含义与约束jobName导入任务名称。datastoreId目标数据仓库 ID32 位十六进制字符串。dataAccessRoleArnIAM 角色的 ARN该角色需授予 HealthImaging 从输入桶读取、向输出桶写入的权限。inputS3Uri存放 DICOM 文件的 S3 输入桶 URI路径需以/结尾。outputS3Uri导入结果像素数据与元数据清单的输出桶 URI。提交后任务进入SUBMITTED状态随后调用 get-dicom-import-job.js 查询最终状态为COMPLETED响应中的jobProperties会携带submittedAt、endedAt与完整的输入输出 URI。图像集Image Set管理示例文件调用的 API功能get-image-set.jsGetImageSet获取图像集详情get-image-set-metadata.jsGetImageSetMetadata获取图像集元数据search-image-sets.jsSearchImageSets按条件搜索图像集list-image-set-versions.jsListImageSetVersions列出图像集版本copy-image-set.jsCopyImageSet复制图像集delete-image-set.jsDeleteImageSet删除图像集update-image-set-metadata.jsUpdateImageSetMetadata更新图像集元数据获取图像集详情时imageSetVersion为可选项——传空字符串时省略该参数默认获取最新版本get-image-set.jsexport const getImageSet async ( datastoreId xxxxxxxxxxxxxxx, imageSetId xxxxxxxxxxxxxxx, imageSetVersion , ) { const params { datastoreId: datastoreId, imageSetId: imageSetId }; if (imageSetVersion ! ) { params.imageSetVersion imageSetVersion; } const response await medicalImagingClient.send(new GetImageSetCommand(params)); return response; };响应中imageSetState与imageSetWorkflowStatus组合反映图像集生命周期如ACTIVE/CREATEDversionId为当前版本号。搜索图像集是查询影像数据的核心能力search-image-sets.js该示例使用paginateSearchImageSets分页器遍历结果export const searchImageSets async ( datastoreId xxxxxxxx, searchCriteria {}, ) { const paginatorConfig { client: medicalImagingClient, pageSize: 50 }; const commandParams { datastoreId: datastoreId, searchCriteria: searchCriteria }; const paginator paginateSearchImageSets(paginatorConfig, commandParams); const imageSetsMetadataSummaries []; for await (const page of paginator) { // 每页包含 imageSetsMetadataSummaries 列表超过 pageSize 会被截断 imageSetsMetadataSummaries.push(...page.imageSetsMetadataSummaries); console.log(page); } return imageSetsMetadataSummaries; };文件底部演示了三种典型检索模式1按 DICOMPatientId 精确匹配EQUALconst searchCriteria { filters: [ { values: [{ DICOMPatientId: 1234567 }], operator: EQUAL }, ], };2按检查日期时间范围匹配BETWEENconst searchCriteria { filters: [ { values: [ { DICOMStudyDateAndTime: { DICOMStudyDate: 19900101, DICOMStudyTime: 000000 } }, { DICOMStudyDateAndTime: { DICOMStudyDate: 20230901, DICOMStudyTime: 000000 } }, ], operator: BETWEEN, }, ], };也可以对createdAt这类系统字段使用 BETWEEN第二个值取new Date()表示至今。组合过滤 排序则支持DICOMSeriesInstanceUID精确匹配、updatedAt范围过滤与sort.sortOrder: ASC升序排列的叠加。注意 DICOM 日期格式为YYYYMMDD时间格式为HHMMSS。更新图像集元数据update-image-set-metadata.js支持四类操作通过updateImageSetMetadataUpdates区分插入/更新属性insertupdatableAttributes传TextEncoder().encode(JSON.stringify(...))编码的 DICOM JSON元数据 SchemaVersion 为 1.1const insertAttributes JSON.stringify({ SchemaVersion: 1.1, Study: { DICOM: { StudyDescription: CT CHEST } }, }); const updateMetadata { DICOMUpdates: { updatableAttributes: new TextEncoder().encode(insertAttributes), }, }; await updateImageSetMetadata(datastoreID, imageSetID, versionID, updateMetadata, true);移除属性remove_attributeremovableAttributes中的键值必须与既有属性完全一致才能删除。移除实例remove_instance用嵌套的 Series UID → Instances UID 结构定位待删实例。回滚revertupdateMetadata { revertToVersionId: 1 }恢复到指定历史版本。更新是异步过程响应中imageSetState会短暂变为LOCKED、imageSetWorkflowStatus变为UPDATINGlatestVersionId递增如从 1 变为 4。图像帧Image Frame示例文件调用的 API功能get-image-frame.jsGetImageFrame下载图像帧下载图像帧会返回 HTJ2KHigh-Throughput JPEG 2000编码的二进制流示例使用transformToByteArray()转为字节数组并写盘get-image-frame.jsexport const getImageFrame async ( imageFrameFileName image.jph, datastoreID DATASTORE_ID, imageSetID IMAGE_SET_ID, imageFrameID IMAGE_FRAME_ID, ) { const response await medicalImagingClient.send( new GetImageFrameCommand({ datastoreId: datastoreID, imageSetId: imageSetID, imageFrameInformation: { imageFrameId: imageFrameID }, }), ); const buffer await response.imageFrameBlob.transformToByteArray(); writeFileSync(imageFrameFileName, buffer); return response; };响应中contentType为application/octet-streamimageFrameBlob是流对象需要异步转换为字节数组后再落盘默认文件名image.jph.jph 即 HTJ2K 文件扩展名。资源标签管理示例文件调用的 API功能tag-resource.jsTagResource为资源添加标签untag-resource.jsUntagResource移除资源标签list-tags-for-resource.jsListTagsForResource列出资源标签标签以键值对 JSON 形式传入tag-resource.jsexport const tagResource async ( resourceArn arn:aws:medical-imaging:us-east-1:xxxxxx:datastore/xxxxx/imageset/xxx, tags {}, ) { const response await medicalImagingClient.send( new TagResourceCommand({ resourceArn: resourceArn, tags: tags }), ); return response; };resourceArn既可以是数据仓库 ARN...:datastore/datastoreId也可以是图像集 ARN...:datastore/datastoreId/imageset/imageSetId。TagResource成功返回 HTTP 204无内容ListTagsForResource从响应中解构tags字段。场景示例三个端到端工作流scenarios/ 下提供 3 个组合多个 API 的完整场景可直接运行。场景一导入图像集并下载图像帧核心工作流这是模块中最完整的场景位于 scenarios/health-image-sets/index.js对应其详细文档 scenarios/health-image-sets/README.md。工作流以命令行交互应用的形式实现完成以下 6 个步骤设置 DICOM 导入所需的资源通过 AWS CloudFormation 模板一次性创建 4 类资源——HealthImaging 数据仓库、S3 输入桶、S3 输出桶、具备导入权限的 IAM 角色。导入 DICOM 文件到数据仓库从 NCI 影像数据共享National Cancer Institute Imaging Data CommonsIDC的公共 S3 桶复制选定的 DICOM 检查数据到自己的输入桶然后启动 DICOM 导入任务。获取导入任务产生的图像集 ID通过导入任务的输出清单manifest解析出全部图像集 ID。获取图像集的图像帧 ID调用 GetImageSetMetadata 从元数据中提取图像帧 ID 列表。下载、解码并校验图像帧调用 GetImageFrame 下载 HTJ2K 编码帧用 openjphjs仓库内嵌 WebAssembly 解码器位于 scenarios/health-image-sets/pixel-data-verification/openjphjs/解码为位图并以 CRC32 校验和验证数据完整性。清理资源按用户选择删除图像集与 CloudFormation 栈。从 index.js 的源码结构可以看到该工作流被组织为 3 个可独立运行的子场景--scenario参数指定每个子场景由若干步骤函数串联子场景步骤链作用deploydeployStack → getStackName → getDatastoreName → getAccountId → createStack → waitForStackCreation → outputState → saveState部署 CloudFormation 栈并保存状态demodoCopy → selectDataset → copyDataset → doImport → startDICOMImport → waitForImportJobCompletion → getManifestFile → parseManifestFile → getImageSetMetadata → doVerify → decodeAndVerifyImages → saveState拷贝数据、导入、解析 ID、下载解码校验destroyconfirmCleanup → deleteImageSets → deleteStack删除图像集与栈步骤实现分布在 deploy-steps.js、dataset-steps.js、import-steps.js、image-set-steps.js、image-frame-steps.js、verify-steps.js 与 clean-up-steps.js 中。中间步骤产生的状态会通过saveState/loadState持久化为*state.json文件供demo、destroy阶段复用。运行命令三阶段串行执行node index.js --scenario deploy # 部署资源 node index.js --scenario demo # 拷贝并导入 DICOM下载解码校验图像帧 node index.js --scenario destroy # 清理资源支持-h|--help、-y|--yes、-v|--verbose三个选项分别查看帮助、跳过交互确认、输出详细日志。场景选项统一通过 Node.js 内置的util.parseArgs解析。场景二数据仓库标签管理scenarios/tagging-datastores.js 演示对数据仓库资源的标签全流程const datastoreArn arn:aws:medical-imaging:us-east-1:123456789012:datastore/12345678901234567890123456789012; const tags { Deployment: Development }; await tagResource(datastoreArn, tags); // 打标签 const { tags } await listTagsForResource(datastoreArn); // 列标签 await untagResource(datastoreArn, [Deployment]); // 按键移除标签场景三图像集标签管理scenarios/tagging-imagesets.js 与场景二流程完全一致仅将 ARN 换成图像集级别const imagesetArn arn:aws:medical-imaging:us-east-1:123456789012:datastore/12345678901234567890123456789012/imageset/12345678901234567890123456789012;两者均复用 actions/tag-resource.js、actions/untag-resource.js、actions/list-tags-for-resource.js体现了动作函数可复用、场景编排组合的设计模式。运行示例运行单个动作node ./actions/fileName例如node ./actions/create-datastore.js node ./actions/get-image-set.js注意大多数动作脚本直接运行时使用文件内的默认占位参数如DATASTORE_NAME、32 位1组成的假 ID、示例 ARN实际使用请修改函数入参为真实资源标识。运行场景node ./scenarios/fileName即node ./scenarios/tagging-datastores.js node ./scenarios/tagging-imagesets.js node ./scenarios/health-image-sets/index.js --scenario demo带命令行选项运行部分动作与场景支持命令行选项通过 Node.js 内置的util.parseArgs解析node ./scenarios/fileName --option1 --option2每个脚本具体支持哪些选项见对应文件中parseArgs的用法场景示例可执行node index.js -h查看。测试模块在 tests/ 目录下提供了完整的 Vitest 测试套件⚠运行测试可能产生 AWS 费用。测试分为两类单元测试如 get-image-frame.unit.test.js、tag-resource.unit.test.js、update-image-set-metadata.unit.test.js 等Mock 客户端响应验证命令参数构造正确。集成测试如 create-delete-datastore.integration.test.js、get-datastore.integration.test.js、list-datastores.integration.test.js需要真实 AWS 环境。场景步骤测试hlth-img-*.unit.test.js系列覆盖 health-image-sets 场景中的 deploy、dataset、import、image-frame、verify 等步骤逻辑。测试命令见 package.json 的 scriptsnpm test # 运行全部单元测试vitest run unit npm run integration-test # 运行集成测试并输出 JUnit 报告集成测试将结果写入test_results/medical-imaging-test-results.junit.xml。完整的测试运行指南参见 javascriptv3 目录下的 README。延伸资源HealthImaging Developer Guide服务开发者指南HealthImaging API ReferenceAPI 参考SDK for JavaScript (v3) HealthImaging referenceJavaScript v3 客户端参考小结本文完整梳理了 medical-imaging 模块的代码结构一个 Hello 示例打通 SDK 使用流程18 个单动作示例覆盖数据仓库、DICOM 导入、图像集、图像帧、标签五大 API 面三个场景示例则示范了从基础设施部署到影像数据导入、解码校验、资源清理的完整工程化工作流。实践时请牢记三条红线遵守最低权限原则、注意区域可用性、时刻留意可能产生的 AWS 费用。赞分享示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载相关推荐使用 AWS SDK for C 导入 HealthImaging 影像集并下载校验图像帧imaging_set_and_frames_workflow 实战指南使用 AWS SDK for C 导入 HealthImaging 影像集并下载校验图像帧imaging_set_and_frames_workflow示例工程教程后端AWS HealthImaging 像素数据校验实战使用 AWS SDK for JavaScript v3 验证 DICOM 解码帧的 CRC32 一致性AWS HealthImaging 像素数据校验实战使用 AWS SDK for JavaScript v3 验证 DICOM 解码帧的 CRC32 一致性示例工程教程后端使用 AWS SDK for Java 2.x 操作 AWS HealthImaging数据存储、DICOM 导入与影像集管理实战指南使用 AWS SDK for Java 2.x 操作 AWS HealthImaging数据存储、DICOM 导入与影像集管理实战指南 本篇技术指南基于 ja示例工程教程后端上一篇SPT-AKI存档编辑器塔科夫离线版玩家的终极管理工具下一篇抖音视频下载器免费教程十分钟搞定无水印下载和主页批量下载创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表