如何在UKB-RAP的DNAnexus JupyterLab中加载眼底图像数据
在UKB-RAP的DNAnexus JupyterLab中加载UK-Biobank眼底图像方法
单个指定图像加载(以eid=1234567的p21015_i0_a0为例)
已知目标图像的entity=participant、name=p21015_i0_a0、eid=1234567及存储路径,可按以下步骤加载:
- 定位目标图像文件ID
使用dxpy匹配eid和字段名找到对应文件:
import dxpy # 获取当前项目ID project_id = dxpy.find_one_project()["id"] # 查找目标图像文件(通过eid和name模糊匹配) file_obj = dxpy.find_one_data_object( typename="File", name=f"*{1234567}*p21015_i0_a0*", folder=f"/{project_id}/Assessment centre/Eye measures/Retinal optical coherence tomography", project=project_id ) file_id = file_obj["id"]
- 下载图像到JupyterLab工作目录
# 根据实际图像格式修改后缀(如.tif/.jpeg) dxpy.download_dxfile(file_id, "p21015_i0_a0.png")
- 加载并查看图像
用Python图像处理库加载(示例用PIL):
from PIL import Image img = Image.open("p21015_i0_a0.png") img.show()
批量加载眼底图像
基于你已掌握的表型数据提取流程,批量处理图像需重点关注附件字段的元数据提取,步骤如下:
- 筛选图像相关字段
从数据字典中定位participant实体下的所有眼底图像字段(以p21015开头为例):
import pandas as pd import glob import os # 加载数据字典(复用你的现有代码) path = os.getcwd() data_dict_csv = glob.glob(os.path.join(path, "*.data_dictionary.csv"))[0] data_dict_df = pd.read_csv(data_dict_csv) # 筛选participant实体下的p21015系列图像字段 image_fields = list( data_dict_df.loc[ (data_dict_df["entity"] == "participant") & (data_dict_df["name"].str.startswith("p21015")), "name" ].values ) # 格式化为dx extract_dataset所需的字段格式 image_fields_str = ",".join([f"participant.{f}" for f in image_fields])
- 提取图像元数据(含文件ID)
使用--attachments参数提取图像附件的文件ID和路径信息:
import subprocess import dxpy # 获取dataset标识(复用你的现有代码) dispensed_dataset_id = dxpy.find_one_data_object(typename='Dataset', name='app*.dataset', folder='/', name_mode='glob')['id'] project_id = dxpy.find_one_project()["id"] dataset = ":".join([project_id, dispensed_dataset_id]) # 执行提取命令,生成包含图像文件ID的元数据文件 cmd = [ "dx", "extract_dataset", dataset, "--fields", image_fields_str, "--attachments", # 关键:获取附件类字段的文件引用 "--delimiter", ",", "--output", "retinal_images_metadata.csv" ] subprocess.check_call(cmd)
- 批量下载并加载图像
遍历元数据文件,批量下载图像到本地并加载:
# 读取元数据 metadata_df = pd.read_csv("retinal_images_metadata.csv") # 创建存储目录 os.makedirs("retinal_images", exist_ok=True) # 批量下载 for idx, row in metadata_df.iterrows(): eid = row["eid"] for field in image_fields: file_id = row[f"{field}_file_id"] if pd.notna(file_id): # 生成唯一文件名 filename = f"{eid}_{field}.png" dxpy.download_dxfile(file_id, f"retinal_images/{filename}") # 批量加载示例(转为numpy数组) from PIL import Image import numpy as np image_array_list = [] for img_path in glob.glob("retinal_images/*.png"): img = Image.open(img_path) image_array_list.append(np.array(img))
注意事项
- 图像格式:UK-Biobank的OCT图像多为TIFF格式,下载时需对应修改文件后缀。
- 存储空间:批量下载前确认JupyterLab工作目录的可用空间,若图像数量大,建议采用流式处理(直接通过
dxpy在云端处理,无需全量下载)。 - 权限验证:确保当前项目拥有目标图像文件的读取权限。
内容的提问来源于stack exchange,提问作者Jay Woden
相关产品推荐
相关产品推荐

