如何在Python中实现医学扫描图像与ROI图像的叠加显示?
嘿,这个需求太常见啦!用Python的图像处理库就能轻松搞定,我给你准备了两种常用的实现方案,你可以根据自己的习惯来选~
方案1:用OpenCV实现图像叠加
OpenCV是处理医学图像的常用工具,操作起来灵活度很高。
首先得先安装OpenCV:
pip install opencv-python
下面是具体代码,我默认你的ROI图像是灰度图(大部分医学ROI标注都是这种形式),如果你的ROI已经是彩色图,可以跳过灰度转彩色的步骤:
import cv2 import numpy as np # 读取原始扫描图像和ROI图像 scan_img = cv2.imread('扫描图像.jpg') roi_img = cv2.imread('ROI图像.jpg', 0) # 0表示以灰度模式读取 # 把灰度ROI转换成彩色格式,方便给ROI添加醒目颜色 roi_color_mask = cv2.cvtColor(roi_img, cv2.COLOR_GRAY2BGR) # 给ROI区域设置颜色,这里用红色(OpenCV采用BGR格式,所以红色是(0,0,255)) # 非ROI区域保持黑色,ROI区域设为红色 roi_color_mask[roi_img == 0] = [0, 0, 0] roi_color_mask[roi_img > 0] = [0, 0, 255] # 叠加图像,通过权重平衡原图和ROI的显示效果 # 参数分别是:原图、原图权重、ROI掩码、ROI权重、亮度调整(一般设0即可) overlay_result = cv2.addWeighted(scan_img, 0.7, roi_color_mask, 0.3, 0) # 可以选择显示结果或者保存到本地 cv2.imshow('扫描图+ROI叠加结果', overlay_result) cv2.waitKey(0) # 按任意键关闭显示窗口 cv2.destroyAllWindows() cv2.imwrite('叠加后的图像.jpg', overlay_result)
小提示:
- 如果两张图尺寸不一致,记得先用
cv2.resize(roi_img, (scan_img.shape[1], scan_img.shape[0]))把ROI图缩放到和扫描图一样大 - 你可以调整权重值(比如把0.7和0.3换成0.8和0.2),让原图更清晰或者ROI更突出
- 颜色也可以随便换,比如蓝色是
(255,0,0),绿色是(0,255,0)
方案2:用Pillow(PIL)实现图像叠加
如果你更习惯用Pillow这种偏向Python原生的图像处理库,也可以试试这个方案:
先安装Pillow:
pip install pillow
代码示例:
from PIL import Image, ImageDraw # 读取图像,确保扫描图是RGB格式 scan_img = Image.open('扫描图像.jpg').convert('RGB') roi_img = Image.open('ROI图像.jpg').convert('L') # 转为灰度图 # 创建一个和扫描图尺寸相同的彩色掩码画布 roi_mask = Image.new('RGB', scan_img.size, (0, 0, 0)) draw = ImageDraw.Draw(roi_mask) # 遍历ROI图像,把有内容的区域(ROI)画成红色 width, height = roi_img.size for x in range(width): for y in range(height): if roi_img.getpixel((x, y)) > 0: draw.point((x, y), fill=(255, 0, 0)) # Pillow采用RGB格式,红色是(255,0,0) # 叠加图像,alpha参数控制ROI的透明度(0=完全显示原图,1=完全显示ROI) overlay_result = Image.blend(scan_img, roi_mask, alpha=0.3) # 显示或保存结果 overlay_result.show() overlay_result.save('叠加后的图像.jpg')
额外提醒:
- 如果你的ROI是带透明通道的PNG图,那操作更简单,直接用
Image.alpha_composite()就能叠加,不用自己手动画掩码 - 遍历像素的方式对于超大图来说可能有点慢,你也可以把PIL图像转成numpy数组来处理,速度会快很多
内容的提问来源于stack exchange,提问作者Mass17
相关产品推荐
相关产品推荐

