如何结合Mask R-CNN与OpenCV自动提取眼部睑结膜区域
基于Mask R-CNN结合OpenCV精准提取睑结膜区域实现方案
核心思路
先通过Mask R-CNN实例分割模型精准识别并分割出睑结膜区域,得到该区域的二进制掩码,再用OpenCV将掩码与原始图像结合,提取出仅包含睑结膜的图像区域,最后在该区域内进行红色像素统计,以此区分贫血与非贫血状态。
实现步骤与代码
1. 前期准备
- 准备标注好的睑结膜样本数据集:用LabelMe等工具标注图像中的睑结膜区域,将标注文件转换为COCO格式(适配Mask R-CNN训练)。
- 训练自定义Mask R-CNN模型:基于matterport的Mask R-CNN实现,将睑结膜作为自定义类别进行训练,得到训练好的模型权重文件(如
mask_rcnn_conjunctiva.h5)。
2. Mask R-CNN推理获取睑结膜掩码
import cv2 import numpy as np from mrcnn.config import Config from mrcnn import model as modellib # 自定义配置类 class ConjunctivaConfig(Config): NAME = "conjunctiva" NUM_CLASSES = 1 + 1 # 背景 + 睑结膜 IMAGES_PER_GPU = 1 DETECTION_MIN_CONFIDENCE = 0.7 # 调整置信度阈值,提升精度 # 初始化模型并加载权重 config = ConjunctivaConfig() model = modellib.MaskRCNN(mode="inference", config=config, model_dir="./") model.load_weights("mask_rcnn_conjunctiva.h5", by_name=True) # 读取图像 image = cv2.imread("c:/users/stk/desktop/d.png") rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 模型推理 results = model.detect([rgb_image], verbose=1) r = results[0] # 获取睑结膜掩码(假设只有一个睑结膜实例) if r['masks'].shape[-1] > 0: # 取置信度最高的实例掩码 mask = r['masks'][:, :, 0].astype(np.uint8) * 255 else: print("未检测到睑结膜区域") mask = np.zeros_like(image[:, :, 0])
3. OpenCV结合掩码提取睑结膜区域并统计红色像素
# 提取睑结膜区域 conjunctiva_region = cv2.bitwise_and(image, image, mask=mask) # 转换到HSV色彩空间,统计区域内红色像素 hsv = cv2.cvtColor(conjunctiva_region, cv2.COLOR_BGR2HSV) # 红色范围阈值 lower_red1 = np.array([0, 120, 70]) upper_red1 = np.array([10, 255, 255]) lower_red2 = np.array([170, 120, 70]) upper_red2 = np.array([180, 255, 255]) mask_red1 = cv2.inRange(hsv, lower_red1, upper_red1) mask_red2 = cv2.inRange(hsv, lower_red2, upper_red2) mask_red = mask_red1 + mask_red2 # 统计红色像素数量 red_pixel_count = cv2.countNonZero(mask_red) # 统计睑结膜区域总像素数量 total_pixel_count = cv2.countNonZero(mask) # 计算红色像素占比 red_ratio = red_pixel_count / total_pixel_count if total_pixel_count > 0 else 0 print(f"睑结膜区域红色像素占比: {red_ratio:.4f}") # 保存提取的睑结膜区域和红色像素掩码 cv2.imwrite("extracted_conjunctiva.png", conjunctiva_region) cv2.imwrite("conjunctiva_red_mask.png", mask_red) # 显示结果 cv2.imshow("提取的睑结膜区域", conjunctiva_region) cv2.imshow("睑结膜红色像素掩码", mask_red) cv2.waitKey(0) cv2.destroyAllWindows()
关键说明
- 模型训练阶段:确保标注样本覆盖不同患者的眼部图像(不同角度、光照、肤色),提升模型泛化能力;可调整
DETECTION_MIN_CONFIDENCE参数过滤低置信度检测结果。 - 对比传统方法:先分割睑结膜再统计红色像素,完全规避了眼部其他红色区域(如虹膜周边血管)的干扰,大幅提升统计精度。
内容的提问来源于stack exchange,提问作者user25377348
相关产品推荐
相关产品推荐

