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

基于OpenCV的伤口形状检测:当前误识别为圆形,是否改用轮廓检测?

改用轮廓检测是解决伤口区域识别的最优方案

是的,你绝对应该改用轮廓检测。你的当前方案依赖cv.HoughCircles,只能识别规则圆形,但从输入图片来看,伤口是不规则的类椭圆形/异形区域,Hough圆检测完全无法覆盖这种场景——这就是你当前输出不符合需求的核心原因。轮廓检测能精准捕捉任意形状的区域边界,完美适配伤口识别的需求。

替换方案:Python版轮廓检测实现

直接把你代码中的Hough圆检测部分替换为以下轮廓检测逻辑,适配你的FastAPI接口:

修改后的完整接口代码

@app.post("/api/detect-shapes")
async def post_detect_shapes(image_file: UploadFile = File(...)):
    # 读取并解码图片
    contents = await image_file.read()
    nparr = np.fromstring(contents, np.uint8)
    img = cv.imdecode(nparr, cv.IMREAD_COLOR)

    output = img.copy()
    detected_polygons = []

    # 轮廓检测核心流程
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    # 自动二值化分割伤口与背景
    _, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU)
    # 形态学操作去除小噪点
    kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE, (5,5))
    binary = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel, iterations=2)

    # 查找外部轮廓(只保留最外层区域,避免内部干扰)
    contours, _ = cv.findContours(binary.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)

    # 过滤小轮廓并简化形状
    min_area = 500  # 可根据伤口大小调整阈值
    for cnt in contours:
        area = cv.contourArea(cnt)
        if area > min_area:
            # 轮廓近似,减少点数量同时保留形状特征
            epsilon = 0.01 * cv.arcLength(cnt, True)
            approx = cv.approxPolyDP(cnt, epsilon, True)
            detected_polygons.append(approx.tolist())
            # 在输出图上绘制轮廓
            cv.drawContours(output, [approx], -1, (0,255,0), 2)

    # 保留原有的base64转换与返回逻辑
    original_img_pil = Image.fromarray(cv.cvtColor(img, cv.COLOR_BGR2RGB))
    original_img_base64 = image_to_base64(original_img_pil)

    output_img_pil = Image.fromarray(cv.cvtColor(output, cv.COLOR_BGR2RGB))
    output_img_base64 = image_to_base64(output_img_pil) 

    rn:int = random.randint(0, 100)
    return {'original_img_base64': original_img_base64, 'output_img_base64': output_img_base64, "detected_polygon": detected_polygons}

关键步骤说明

  • 自动二值化:用OTSU算法自动计算阈值,快速区分伤口(深色)与皮肤(浅色)区域,适配不同光照条件的图片
  • 形态学去噪:通过开运算去除图片中的微小噪点,避免误识别小区域
  • 轮廓过滤:设置最小面积阈值,过滤掉灰尘、毛发等干扰轮廓
  • 轮廓近似:简化轮廓点数量,减少返回的数据量,同时保持伤口的形状特征

优化建议

  • 根据实际伤口的大小,调整min_area参数
  • 如果伤口与皮肤的颜色差异明显,可尝试先通过HSV颜色空间提取伤口区域,再做轮廓检测,精度会更高
  • 可加入轮廓密实度(Solidity)判断,过滤掉空洞较多的干扰区域(伤口区域通常是密实的)

内容的提问来源于stack exchange,提问作者The Old County

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 03:17:44