You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 21:36:14