如何将DICOM图像分割为图块?image_slicer函数适配问题求助
我明白你遇到的问题了——image_slicer这个工具主要是为PIL图像设计的,直接喂DICOM转出来的numpy数组肯定不兼容。不过没关系,有两种靠谱的解决办法,看你需求选:
方案1:把numpy数组转成PIL图像后用image_slicer
首先要处理DICOM的像素值,比如CT图像的HU值范围(-1024到3071左右)超出了PIL默认的8位图像范围,直接转换会导致显示异常或者信息丢失,所以得先做归一化映射:
import numpy as np from PIL import Image import image_slicer # 假设你的DICOM数组是dcm_array dcm_array = dcm_files[0] # 第一步:将HU值归一化到0-255区间(可根据你的实际数据调整范围) min_val = -1024 # CT图像中空气的HU值 max_val = 3071 # CT图像中骨骼的典型HU值上限 normalized_array = ((dcm_array - min_val) / (max_val - min_val)) * 255 # 转换为PIL支持的uint8类型 normalized_array = normalized_array.astype(np.uint8) # 转成PIL图像对象 pil_image = Image.fromarray(normalized_array) # 现在可以用image_slicer分割了,比如分成2x2共4块 tiles = image_slicer.slice(pil_image, 4, save=False) # 手动保存每块图像 for i, tile in enumerate(tiles): tile.save(f"dicom_tile_{i}.png")
注意:如果是MRI等其他模态的DICOM,要调整对应的像素值范围,确保归一化逻辑合理。
方案2:直接用numpy手动分割(更适合保留原始医学数据)
如果不想转成图像格式,想保留原始的HU值或像素数据,直接用numpy操作更稳妥,完全不会丢失信息,适合后续医学分析任务。比如要把图像分成指定行数和列数的块:
import numpy as np def slice_dicom_array(dcm_array, rows, cols): # 获取原始图像的高度和宽度 img_h, img_w = dcm_array.shape # 计算每个块的基础尺寸(如果不能整除,最后一块会自动适配剩余区域) tile_h = img_h // rows tile_w = img_w // cols tiles_list = [] for i in range(rows): for j in range(cols): # 计算当前块的坐标范围 y_start = i * tile_h y_end = y_start + tile_h if i != rows-1 else img_h x_start = j * tile_w x_end = x_start + tile_w if j != cols-1 else img_w # 切割并保存块 tile = dcm_array[y_start:y_end, x_start:x_end] tiles_list.append(tile) return tiles_list # 用法示例:将图像分成3行4列的块 dcm_array = dcm_files[0] tiles = slice_dicom_array(dcm_array, rows=3, cols=4) # 查看每个块的形状,或保存为numpy文件 for idx, tile in enumerate(tiles): print(f"Tile {idx}: 形状 {tile.shape}") np.save(f"dicom_tile_{idx}.npy", tile)
内容的提问来源于stack exchange,提问作者aiwan
相关产品推荐
相关产品推荐

